与unicode文本的树建造者问题

时间:2015-09-24 11:42:53

标签: perl unicode html-treebuilder

我使用HTML::TreeBuilder使用tree->lookdown提取网址内容,然后从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字符)可正确打印到文件中。

1 个答案:

答案 0 :(得分:3)

记录在HTML::TreeBuilder

  

当您将文件名传递给parse_file时,HTML::Parser会将其打开   二进制模式,这意味着它被解释为Latin-1(ISO-8859-1)。如果   该文件采用其他编码,如UTF-8或UTF-16,但不会   做正确的事。

     

一种解决方案是使用正确的:encoding自行打开文件   图层,并将文件句柄传递给parse_file。你可以自动化这个   使用IO::HTML中的“html_file”进行处理,它将使用HTML5   编码嗅探算法自动确定正确   :encoding图层并应用它。