2011-03-25 26 views
-1

我需要使用perl讀取包含相似結構的許多HTML文件。Perl中的模式所需的單行正則表達式

結構由 STRRRR ... E的

  • 小號 = HTML頭表開始
  • 牛逼 =獨特的表結構開始在HTML文件中之前(我可以找出它)
  • R =一組html元素(這些都是tr的,我也可以識別它)
  • Ë =所有其餘 - singnifies端面R的

我想提取所有的R的陣列中採用單線 「M」 perlop得到。

我正在尋找這樣的事情:

@all_Rs = $ HTMLFILE = - M {ST(R)* E} GS;

但它從來沒有解決。

到現在爲止我一直在做四圍的方式做到這一點喜歡使用刪除不需要的文本,用於循環等 我想從這個頁面中提取的所有行:http://www.trainenquiry.com/StaticContent/Railway_Amnities/Enquiry%20-%20North/STATIONS.aspx ,有許多這樣的頁面。

+10

這是今天的第三或第四次,有人想用正則表達式做一些事情,但堅持用一個singel,光榮的正則表達式來做。這是一項運動,還是什麼?我放棄了我的一部分。只有這麼多:這是合理的,以堅持在一個大表達式(而不是函數,模塊等)中具有複雜的功能 – Ingo 2011-03-25 14:38:06

+4

不要用正則表達式解析HTML:http://stackoverflow.com/questions/590747/using-regular-expressions-to-parse-html-why-not – reinierpost 2011-03-25 14:57:47

+1

你有S,T,R和E正則表達式嗎?如果是,並且他們單獨工作,則可以像您概述的那樣將它們組合在一起。 – bvr 2011-03-25 15:01:57

回答

2

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; 
+0

我可以在哪裏下載XML模塊以及文檔? – AgA 2011-03-25 18:42:41

+0

我的答案中的鏈接將導致帶有文檔的CPAN頁面以及可供下載用於手動安裝的文件。如果你在Linux或類似的系統上,你的發行版可能有一個可以安裝的軟件包,否則如果你有root權限,可以使用'cpan'命令。 'cpan XML :: LibXML'。如果你在Windows上使用ActivePerl,它帶有一個'ppm'工具,它應該能夠安裝XML :: LibXML。 – 2011-03-25 21:32:12

5

正則表達式是錯誤的工具。使用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'); 

HTML::TreeBuilder::XPath繼承自HTML::TreeBuilder

+0

不,我正在處理語法不正確的html文件,並且許多打開的關閉標籤丟失。這就是爲什麼我不使用DOM來遍歷樹。我想提取所有行:http://www.trainenquiry.com/StaticContent/Railway_Amnities/Enquiry%20-%20North/STATIONS.aspx。請看這個頁面有很多html錯誤,是我見過的最糟糕的頁面。 – AgA 2011-03-25 17:07:33

2

如果要處理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/&nbsp;/ /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"; 
    } 
}