0

我正在使用通过使用然后从查找方法返回的字符串中提取文本部分HTML::TreeBuilder来提取 url 的内容。tree->lookdown我的问题是当我阅读该文本并将其写入文件时显示为垃圾。我无法在这方面取得进展。

我的示例代码:

use HTML::TreeBuilder;
use HTML::Element;

use utf8;

$url = $ARGV[0];
$page = `wget -qO -  "$url"| tee data.txt`;
#print "iam $page\n";
my $tree = HTML::TreeBuilder->new(  );
$tree->parse_file('data.txt');

my @story = $tree->look_down(
    _tag  => 'div',
    class => 'storydescription'
);

my @title = $tree->look_down(
    _tag  => 'title'
);

open(OUT,">","story.txt") or die"Cannot open story.txt:$!\n";
binmode(OUT,":utf8");

foreach my $story(@story) {
    print OUT $story->as_text;
}
close(OUT);

我已经为输出文件句柄尝试了 binmode,但它没有用,并且 Unicode 以外的文本(例如 ascii 字符)可以正确打印到文件中。

4

1 回答 1

3

它记录在HTML::TreeBuilder中:

当您将文件名传递给 时parse_fileHTML::Parser以二进制模式打开它,这意味着它被解释为 Latin-1 (ISO-8859-1)。如果文件是另一种编码,如 UTF-8 或 UTF-16,这不会做正确的事情。

一种解决方案是使用适当的层自己打开文件:encoding ,并将文件句柄传递给parse_file. 您可以使用“html_file”中的“html_file”自动执行此过程IO::HTML,它将使用 HTML5 编码嗅探算法自动确定 :encoding并应用正确的层。

于 2015-09-24T11:50:33.630 回答