簡體   English   中英

Perl模式所需的單行正則表達式

[英]Single line regular expression needed for a pattern in Perl

我需要使用perl讀取許多包含類似結構的HTML文件。

結構由STRRRR ... E組成

  • S = html標頭,就在表格開始之前
  • T = html文件中的唯一表開始結構(我可以識別它)
  • R =一組html元素(那些是tr的,我也可以識別)
  • E =所有剩余-單數R的末端

我想使用單行“ 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');

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

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/&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";
   }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM