Проблема Tree Builder с текстом Unicode

Я использую HTML::TreeBuilder извлечь содержимое URL с помощью 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 ответ

Решение

Это задокументировано в http://p3rl.org/HTML::TreeBuilder:

Когда вы передаете имя файла parse_file, HTML::Parser открывает его в двоичном режиме, что означает, что он интерпретируется как Latin-1 (ISO-8859-1). Если файл находится в другой кодировке, такой как UTF-8 или UTF-16, это не будет работать правильно.

Одно из решений - открыть файл самостоятельно, используя :encoding слой и передать дескриптор файла parse_file, Вы можете автоматизировать этот процесс, используя "html_file" в IO::HTML, который будет использовать алгоритм сниффинга кодировки HTML5 для автоматического определения правильного :encoding слой и применить его.

Другие вопросы по тегам