我期待能夠從HTML/XHTML文檔中提取所有純文本並進行分析/修改,然後在需要時進行替換。我可以使用HTML::Parser來做到這一點,還是應該使用XML::Parser?我應該使用HTML :: Parser還是XML :: Parser來提取和替換文本?
是否有任何人都知道的好示範?
我期待能夠從HTML/XHTML文檔中提取所有純文本並進行分析/修改,然後在需要時進行替換。我可以使用HTML::Parser來做到這一點,還是應該使用XML::Parser?我應該使用HTML :: Parser還是XML :: Parser來提取和替換文本?
是否有任何人都知道的好示範?
你也應該看看Web::Scraper。
我發現這個模塊比HTML :: Parser模塊更容易,但是如果您熟悉XPath,它會有所幫助。
取決於實際頁面,解析HTML是非常不可預測的 - 它就像pdf顯示,而不是數據導向。
HTML :: Parser的方法基於令牌和回調。當您在想要提取或更改數據的上下文中出現特別複雜的條件時,我發現它非常方便。
否則我更喜歡基於樹的方法。 HTML::TreeBuilder::XPath(基於HTML :: Parser的ultimely)允許您使用XPath查找節點。它返回HTML::Element s。該文檔有點稀缺(好吧,分散在幾個模塊中)。但仍然是挖掘HTML的快速方法。
如果您處理純XML,XML::Twig是一款出色的解析器:非常好的內存管理,可以將樹和流方法結合起來。文件非常好。
說在某人的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 = … ">comparing PERL md5() and PHP md5()</a></h3> +#$linkTrue = … ">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:」突兀的元素屬性,而不是文本段的一部分。
你應該使用哪個模塊取決於你正在嘗試做什麼。對於初學者,HTML::Parser附帶了很好的例子,其中還包括一個從HTML文檔中提取純文本的腳本。
不要嘗試使用XML解析器解析HTML文檔:由於大量有效的HTML構造不是有效的XML,因此您會發現自己處於痛苦的世界。
不要嘗試使用HTML解析器解析XML文檔:您將失去XML文檔在可以解析之前格式良好的更嚴格要求的所有優點。