Perl LibXML аккуратный HTML - PullRequest
       20

Perl LibXML аккуратный HTML

1 голос
/ 06 ноября 2019

У меня есть этот HTML-фрагмент в файле: 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>

В приведенном выше коде теги не совпадают (<div> и </span>). Я написал следующие коды 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. Я думаю, это должно быть проблемой кодирования. Я не уверен, где изменить настройки кодировки. Кто-нибудь сталкивался с этой проблемой раньше?

Спасибо.

1 Ответ

3 голосов
/ 06 ноября 2019

В соответствии с документацией, скопированной ниже, toStringHTML создает закодированную строку байтов, поэтому вам не нужно ее кодировать снова. Заменить

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

на

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

toStringHTML

$str = $document->toStringHTML();

toStringHTML сериализоватьдерево в байтовую строку в документе, кодируемую как HTML. С помощью этого метода отступы автоматически и управляются внутри libxml2.

...