【问题标题】:Perl LibXML tidy HTMLPerl LibXML 整洁的 HTML
【发布时间】:2019-11-05 23:14:36
【问题描述】:

我在文件中有这个 HTML sn-p: 1.html:

<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"/></head>
<body>
abash
<div>a·bash·ment</span>
<h6>1</h6>
</body>
</html>

在上面的代码中,标签不匹配(&lt;div&gt;&lt;/span&gt;)。我编写了以下 XML::LibXML 代码来更正和整理标签:

use 5.31.3;
use strict;
use warnings FATAL => 'all';
use XML::LibXML;
use utf8::all;
open(my $FH, ">:encoding(UTF-8)", "2.html") or die "Can't open '1.html': $!";
@ARGV = "1.html";
my $parser = XML::LibXML->new();
$parser->recover(1); 
say $FH $parser->parse_html_string(join "", <>)->toStringHTML();

结果是:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html>
<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"></head>
<body>
abash
<div>a·bash·ment
</div>
</body>
</html>

如您所见,div 标签的内容显示不正确,应该与原来的a·bash·ment 相同。我想这应该是一个编码问题。我不确定在哪里更改编码设置。以前有人遇到过这个问题吗?

谢谢。

【问题讨论】:

  • 出于好奇,您为什么需要 5.31.3?除非它修复了一些影响您的代码的特定错误,否则需要开发版本真的很奇怪。您发布的代码甚至不需要比 5.8 更新的任何东西!
  • 提示:请注意,use 5.12.0; 及更高版本意味着use strict;

标签: perl libxml2


【解决方案1】:

根据下面复制的文档,toStringHTML 会生成一个编码字节字符串,因此您不应再次对其进行编码。替换

open(my $FH, ">:encoding(UTF-8)", "2.html")

open(my $FH, ">:raw", "2.html")

toStringHTML

$str = $document->toStringHTML();

toStringHTML 将树序列化为文档中编码为 HTML 的字节字符串。使用这种方法缩进是自动的,并由 libxml2 内部管理。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-23
    • 1970-01-01
    • 2017-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-11
    相关资源
    最近更新 更多