0

lookdownメソッドで返された文字列からテキスト部分を使用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を試しましたが、役に立たず、ASCII文字などのUnicode以外のテキストがファイルに正しく出力されました。

4

1 に答える 1

3

HTML::TreeBuilderに文書化されています:

ファイル名を に渡すと、 はファイルをバイナリ モードparse_fileHTML::Parser開きます。つまり、Latin-1 (ISO-8859-1) として解釈されます。ファイルが UTF-8 や UTF-16 などの別のエンコーディングである場合、これは正しく行われません。

1 つの解決策は、適切なレイヤーを使用して自分でファイルを開き、ファイル:encoding ハンドルを に渡すことparse_fileです。で「html_file」をIO::HTML使用すると、このプロセスを自動化できます。これにより、HTML5 エンコーディング スニッフィング アルゴリズムを使用して、適切な :encodingレイヤが自動的に決定され、適用されます。

于 2015-09-24T11:50:33.630 に答える