提问人:Daniel 提问时间:5/17/2018 更新时间:5/21/2018 访问量:57
HTML::Query 如何在 perl 5 中自动完成无效的 HTML?
How HTML::Query autocomplete invalid HTML in perl 5?
问:
我的代码无效,缺少.尽管如此,我还是试图选择其中的元素,但选择器具有违反直觉的行为。HTML
tr
thead
HTML
HTML::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"
}
当然,如果我使用正确的代码而缺少:HTML
tr
<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::Query
HTML
答:
我找到了部分答案。添加到哈希对:%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
在我看来,它是可以改变的。链接到已创建的问题:
我是这个包的维护者。
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所做的,所以任何这样的尝试都可能失败,但让我们看看你能想出什么。
评论