2010-02-08 60 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文檔在可以解析之前格式良好的更嚴格要求的所有優點。