使用Perl或PHP解析大型html文件(本地)

时间:2010-12-01 23:28:09

标签: php perl text-parsing

我有一个大文件 - 我需要解析它并只吐出这部分:schule.php?schulnr = 80287& lschb =

我该如何解析这些东西!?

<td>
    <A HREF="schule.php?schulnr=80287&lschb=" target="_blank">
        <center><img border=0 height=16 width=15 src="sh_info.gif"></center>
    </A>
</td>

很高兴收到你的来信

4 个答案:

答案 0 :(得分:5)

您应该使用像PHP Simple HTML DOM Parser

这样的DOM解析器
// Create DOM from URL or file
$html = file_get_html('http://www.google.com/');

// Find all links 
foreach($html->find('a') as $element) 
       echo $element->href . '<br>';

答案 1 :(得分:5)

在Perl中,我知道扫描HTML的最快捷方式是HTML::PullParser。这是基于强大的HTML解析器,而不是简单的FSA,如Perl正则表达式(没有递归)。

这更像是SAX过滤器,而不是DOM。

use 5.010;
use constant NOT_FOUND => -1;
use strict;
use warnings;

use English qw<$OS_ERROR>;
use HTML::PullParser ();

my $pp 
    = HTML::PullParser->new(
      # your file or even a handle
      file        => 'my.html'
      # specifies that you want a tuple of tagname, attribute hash
    , start       => 'tag, attr' 
      # you only want to look at tags with tagname = 'a'
    , report_tags => [ 'a' ],
    ) 
    or die "$OS_ERROR"
    ;

my $anchor_url;
while ( defined( my $t = $pp->get_token )) { 
    next unless ref $t or $t->[0] ne 'a'; # this shouldn't happen, really
    my $href = $t->[1]->{href};
    if ( index( $href, 'schule.php?' ) > NOT_FOUND ) { 
        $anchor_url = $href;
        last;
    }
}

答案 2 :(得分:4)

Rfvgyhn说的是什么,但在Perl风味中,因为那是标签之一:使用HTML::TreeBuilder

另外,出于原因,为什么RegEx 几乎从来都不是解析XML / HTML的好主意(有时候它很好用主要注意事项),请阅读强制性和臭名昭着的StackOverflow帖子:

RegEx match open tags except XHTML self-contained tags

请注意,如果您的任务的完整范围实际上是“解析HREF链接”,并且您没有“&lt; link&gt;”标签和链接(例如HREF="something"子串)保证不会在任何其他上下文中使用(例如在注释中,或作为文本,或者“HREF =”是链接本身的一部分),它可能会掉落进入正则表达式的“足够好”类别:

my @lines = <>; # Replace with proper method of reading in your file
my @hrefs = map { $_ =~ /href="([^"]+)"/gi; } @lines;

答案 3 :(得分:3)

你也可以这样做(它不是perl而是更“视觉”):

  • 将文档加载到浏览器中, 如果可能的话
  • 安装Firebug扩展程序/附加组件
  • 安装FirePath扩展程序
  • 复制+粘贴此XPath表达式 进入标有“XPpath:”的文本字段

    // a [contains(@href,“schule”)] / @ href

  • 点击“评估”按钮。

还有一些工具可以在命令行上执行此操作,例如: “xmllint”(对于unix)

xmllint --html --xpath '//a[contains(@href, "schule")]/@href' myfile.php.or.html

您可以从上面进行进一步处理。