【问题标题】:How to keep data marked as UTF-8 after parsing with HTML::Tree?使用 HTML::Tree 解析后如何将数据标记为 UTF-8?
【发布时间】:2011-11-06 01:57:30
【问题描述】:

我编写了一个脚本,我在其中输入 UTF-8 编码的 HTML 文件,然后将其解析为带有 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";
    }
}

【问题讨论】:

    标签: perl utf-8 html-parsing html-tree


    【解决方案1】:

    您的代码过于复杂,您使用 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
    

    【讨论】:

      猜你喜欢
      • 2016-05-11
      • 1970-01-01
      • 2018-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-07
      • 2017-05-27
      • 1970-01-01
      相关资源
      最近更新 更多