2010-02-08 57 views

回答

3

你也应该看看Web::Scraper
我发现这个模块比HTML :: Parser模块更容易,但是如果您熟悉XPath,它会有所帮助。
取决于实际页面,解析HTML是非常不可预测的 - 它就像pdf显示,而不是数据导向。

4

HTML :: Parser的方法基于令牌和回调。当您在想要提取或更改数据的上下文中出现特别复杂的条件时,我发现它非常方便。

否则我更喜欢基于树的方法。 HTML::TreeBuilder::XPath(基于HTML :: Parser的ultimely)允许您使用XPath查找节点。它返回HTML::Element s。该文档有点稀缺(好吧,分散在几个模块中)。但仍然是挖掘HTML的快速方法。

如果您处理纯XML,XML::Twig是一款出色的解析器:非常好的内存管理,可以将树和流方法结合起来。文件非常好。

3

说在某人的StackOverflow用户页面中,您想用PERL替换PERL的所有实例。你可以这样做与

#! /usr/bin/perl 

use warnings; 
use strict; 

use HTML::Parser; 
use LWP::Simple; 

my $html = get "http://stackoverflow.com/users/201469/phil-jackson"; 
die "$0: get failed" unless defined $html; 

sub replace_text { 
    my($skipped,$markup) = @_; 
    $skipped =~ s/\bPERL\b/Perl/g; 
    print $skipped, $markup; 
} 

my $p = HTML::Parser->new(
    api_version => 3, 
    marked_sections => 1, 
    case_sensitive => 1, 
    unbroken_text => 1, 
    xml_mode => 1, 
    start_h => [ \&replace_text => "skipped_text, text" ], 
    end_h => [ \&replace_text => "skipped_text, text" ], 
); 

# your page may use a different encoding 
binmode STDOUT, ":utf8" or die "$0: binmode: $!"; 
$p->parse($html); 

输出是我们所期望的:

$ wget -O phil-jackson.html http://stackoverflow.com/users/201469 
$ ./replace-text >out.html 
$ diff -ub phil-jackson.html out.html 
--- phil-jackson.html 
+++ out.html 
@@ -327,7 +327,7 @@ 

PERL: 

-#$linkTrue = &hellip; ">comparing PERL md5() and PHP md5()</a></h3> 
+#$linkTrue = &hellip; ">comparing Perl md5() and PHP md5()</a></h3> 

     <div class="tags t-php t-perl t-md5"> 
      <a href="https://stackoverflow.com/questions/tagged/php" class="post-tag" title="show questions tagged 'php'" rel="tag">php</a> <a href="https://stackoverflow.com/questions/tagged/perl" class="post-tag" title="show questions tagged 'perl'" rel="tag">perl</a> <a href="https://stackoverflow.com/questions/tagged/md5" class="post-tag" title="show questions tagged 'md5'" rel="tag">md5</a>

的“PERL:”突兀的元素属性,而不是文本段的一部分。

1

你应该使用哪个模块取决于你正在尝试做什么。对于初学者,HTML::Parser附带了很好的例子,其中还包括一个从HTML文档中提取纯文本的脚本。

不要尝试使用XML解析器解析HTML文档:由于大量有效的HTML构造不是有效的XML,因此您会发现自己处于痛苦的世界。

不要尝试使用HTML解析器解析XML文档:您将失去XML文档在可以解析之前格式良好的更严格要求的所有优点。