HTML::Query 如何在 perl 5 中自动完成无效的 HTML?

How HTML::Query autocomplete invalid HTML in perl 5?

提问人:Daniel 提问时间:5/17/2018 更新时间:5/21/2018 访问量:57

问:

我的代码无效,缺少.尽管如此,我还是试图选择其中的元素,但选择器具有违反直觉的行为。HTMLtrtheadHTMLHTML::Query

这是我的代码:

#!/usr/bin/env perl

require HTML::Query;
use JSON;

my $q = HTML::Query->new( text => '
<table>
    <thead>
        <th>A</th>
        <th>B</th>
        <th>C</th>
    </thead>
    <tbody>
    <tr>
        <td>E</td>
        <td>F</td>
        <td>G</td>
    </tr>
    </tbody>
</table>
' );

my %data = (
    tr => $q->query('tr')->first->as_trimmed_text,
    tbody => $q->query('tbody')->first->as_trimmed_text
);

print JSON->new->utf8(0)->encode( \%data );

结果:

{
  "tbody": "",
  "tr": "BC"
}

当然,如果我使用正确的代码而缺少:HTMLtr

<table>
    <thead>
    <tr>
        <th>A</th>
        <th>B</th>
        <th>C</th>
    </tr>
    </thead>
    <tbody>
    <tr>
        <td>E</td>
        <td>F</td>
        <td>G</td>
    </tr>
    </tbody>
</table>

然后程序打印疑似直观输出:

{
  "tr": "ABC",
  "tbody": "EFG"
}

我的问题:

  • 为什么在第一种情况下省略了字母?A
  • 为什么找不到?tbody
  • 如何对待无效?它是固定的吗?以哪种方式?HTML::QueryHTML
html perl 解析 html-parsing html-parser

评论


答:

1赞 Daniel 5/17/2018 #1

我找到了部分答案。添加到哈希对:%data

html => $q->as_HTML

我可以看到这个结果无效:HTML

<html>
    <head></head>
    <body>
        <table>
            <thead></thead>
            <th>A</th>
            <tr>
                <th>B</th>
                <th>C</th>
                <tbody></tbody>
            </tr>
            <tr>
                <td>E</td>
                <td>F</td>
                <td>G</td>
            </tr>
        </table>
    </body>
</html>

所以我知道无效是如何转换的。HTML

在我看来,它是可以改变的。链接到已创建的问题:

https://github.com/abw/HTML-Query/issues/8

2赞 kamelkev 5/21/2018 #2

我是这个包的维护者。

HTML::Query 在 HTML::Tree 提供的解析功能之上提供了选择器的魔力。HTML::Query 本身不提供任何解析。您的问题出在 HTML::Tree 上,而不是 HTML::Query 上。

HTML:树很大程度上早于规范一致性。它最初是在IE统治互联网(1999年)时创建的,并根据“现实世界”的用法处理HTML。它在处理 HTML 4 文档方面做得很好,但正如您所注意到的,在 HTML 4 中合法的非常规标记存在问题。处理这些边缘情况没有追索权,图书馆不能也不会处理它们,因为有成千上万的组织依赖现有的实现来继续工作。

HTML::Tree 不支持 HTML5。底层库 HTML::TagSet 的作者拒绝支持它,并与任何提供解决方案或提出接管库的人争论(或忽略)。这种立场有效地阻止了所有衍生项目正确处理 HTML5 - HTML::Query 和 CSS::Inliner 也不例外。

至于使用 HTML::HTML5::P arser 或“任何其他提供 HTML 解析器的 Perl 模块”的建议 - 我欢迎补丁。话虽如此:没有充分维护的Perl库可以带来HTML::Tree所做的,所以任何这样的尝试都可能失败,但让我们看看你能想出什么。