Как сохранить данные, помеченные как UTF-8 после анализа с помощью HTML :: Tree? - PullRequest
0 голосов
/ 29 августа 2011

Я написал скрипт, в котором я прихлебывал HTML-файл в кодировке UTF-8, а затем анализировал его в виде дерева с HTML::Tree. Проблема в том, что после разбора строки больше не помечаются как UTF-8.

Поскольку _utf8_on() не рекомендуется устанавливать флаг, я ищу правильный способ.

Мой упрощенный пример кода:

#!/usr/bin/perl

use strict;
use warnings;
use 5.010;
use utf8::all;
use autodie;
use HTML::Tree;
use Encode qw/is_utf8/;

my $file = shift;
my $tree;

if ($file) {
    my $content = slurp_in( 'file' => $file );
    $tree = html_tree('content' => $content);
} else {
    die "no file";
}

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

if ( is_utf8( $title ) ) {
    say "OK: $title";
} else {
    say "NOT OK: $title";
}

## SUBS
##
sub slurp_in {
    my %v = @_;

    open(my $fh, "<:utf8", $v{file}) || die "no $v{file}: $!";
    local $/;
    my $content = (<$fh>);
    close $fh;

    if ($content) {
        return $content;
    } else {
        die "no content in $v{file} !";
    }
}

sub html_tree {
    my %v = @_;
    my $tree = HTML::Tree->new();
    $tree->utf8_mode(1); ## wrong call here, no such method, but no warnings on it!
    $tree->parse( $v{content} );

    if ($tree) {
        return $tree;
    } else {
        die "no tree here";
    }
}

1 Ответ

6 голосов
/ 29 августа 2011

Ваш код слишком сложен, и вы используете utf8 :: all, декодируете вручную и вызываете этот странный метод сразу.Риторически спрашиваю, что вы ожидаете достичь таким образом?У меня не хватает терпения, чтобы выяснить детали, что и где не так, тем более что вы не разместили ни одного ввода, с помощью которого ваша программа не дает ожидаемого результата, поэтому я резко сократил его до гораздо более простого.Это работает:

#!/usr/bin/env perl
use 5.010;
use strict;
use warnings FATAL => ':all';
use File::Slurp qw(read_file);  # autodies on error
use HTML::Tree qw();

my $file = shift;
die 'no file' unless $file;

my $tree = HTML::Tree->new_from_content(
    read_file($file, binmode => ':encoding(UTF-8)')
);

my $title = $tree->look_down(_tag => 'title');
$title->as_HTML(''); # returns a Perl string
...