Проблема 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
слой и применить его.