![](/img/trans.png)
[英]Use perl regular expression to match a pattern that spans multiple lines in SAS
[英]Single line regular expression needed for a pattern in Perl
我需要使用perl讀取許多包含類似結構的HTML文件。
結構由STRRRR ... E組成
我想使用單行“ m” perlop提取數組中的所有R。
我正在尋找這樣的東西:
@all_Rs = $ htmlfile =〜m {ST(R)* E} gs;
但是它從來沒有解決過。
到現在為止,我一直在做各種方法,例如使用刪除不需要的文本,進行循環等。我想從此頁面中提取所有行: http : //www.trainenquiry.com/StaticContent/Railway_Amnities/Enquiry%20 -%20North / STATIONS.aspx,並且有很多這樣的頁面。
正則表達式是錯誤的工具。 使用HTML解析器。
use HTML::TreeBuilder::XPath;
my $tree= HTML::TreeBuilder::XPath->new_from_content(<<'END_OF_HTML');
<html>
<table>
<tr>1
<tr>2
<tr>3
<tr>4
<tr>5
</table>
</html>
END_OF_HTML
print $_->as_text for $tree->findnodes('//tr');
daxim關於使用真正的解析器是正確的。 我個人的選擇是XML :: LibXML 。
use XML::LibXML
my $parser = XML::LibXML->new();
$parser->recover(1); # don't fail on parsing errors
my $doc = do {
local $SIG{__WARN__} = sub {}; # silence warning about parsing errors
$parser->parse_html_file('http://www.trainenquiry.com/StaticContent/Railway_Amnities/Enquiry%20-%20North/STATIONS.aspx');
};
print $_->toString() for $doc->findnodes('//tr[td[1][@class="td_background"]]');
這使我從該頁面的每個站行。
對於更多的工作,我們可以有一個很好的數據結構來將文本保存在每個單元格中。
use Data::Dumper;
my @data = map {
my $row = $_;
[ map {
$_->findvalue('normalize-space(text())');
} $row->findnodes('td') ]
} $doc->findnodes('//tr[td[1][@class="td_background"]]');
print Dumper \@data;
如果要處理HTML表,請考慮使用知道如何處理HTML表的模塊!
#!/usr/bin/perl
use warnings;
use strict;
use LWP::Simple;
use HTML::TableExtract;
my $html = get 'http://www.trainenquiry.com/StaticContent/Railway_Amnities/Enquiry%20-%20North/STATIONS.aspx';
$html =~ s/ / /g;
my $te = new HTML::TableExtract( depth => 1, count => 2 );
$te->parse($html);
foreach my $ts ($te->table_states) {
foreach my $row ($ts->rows) {
next if $row->[0] =~ /^\s*(Next|Station)/;
next if $row->[4] =~ /^\s*(ARR\/DEP|RESERVATION)/;
foreach my $cell (@$row) {
$cell =~ s/^\s+//;
$cell =~ s/\s+$//;
print "$cell\n";
}
print "\n";
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.