5

我对可以获取格式错误的 HTML 页面并在对其执行一些 XPath 查询之前将其转换为格式良好的 HTML 的解析器感兴趣。你知道吗?

4

3 回答 3

13

您不应该使用 XML 解析器来解析 HTML。使用 HTML 解析器。

请注意,以下是完全有效的 HTML(并且 XML 解析器会阻塞它):

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" 
    "http://www.w3.org/TR/html4/strict.dtd">

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Is this valid?</title>
</head>

<body>

<p>This is a paragraph

<table>

<tr>  <td>cell 1  <td>cell 2
<tr>  <td>cell 3  <td>cell 4

</table>

</body>

</html>

CPAN 上有许多特定于任务(除了通用目的)的 HTML 解析器。他们在大量极其混乱(而且大部分时间无效)的 HTML 上为我完美地工作。

如果您可以指定您要解决的问题,则可以给出具体的建议。

还有HTML::TreeBuilder::XPath使用HTML::Parser将文档解析为树,然后允许您使用 XPath 查询它。我从未使用过它,但请参阅 Randal Schwartz 的HTML Scraping with XPath

给定上面的 HTML 文件,下面的短脚本:

#!/usr/bin/perl

use strict; use warnings;

use HTML::TreeBuilder::XPath;
my $tree= HTML::TreeBuilder::XPath->new;

$tree->parse_file("valid.html");
my @td = $tree->findnodes_as_strings('//td');

print $_, "\n" for @td;

输出:

C:\温度> z
单元格 1
单元格 2
细胞 3
单元格 4

这里的关键点是文档被 HTML 解析器解析为 HTML 文档(尽管我们能够使用 XPath 查询它)。

于 2009-10-27T22:16:53.360 回答
1

除非您想了解更多有关 wheel的信息,否则请使用HTML Tidy代码。

于 2009-10-27T21:02:12.827 回答
1

你可以这样改写这个问题:

我对可能采用格式错误的解析器感兴趣网页C源代码,并把它变成格式良好的HTML执行一些之前的 C 源代码XPath 查询编译和链接就可以了。你知道吗?

现在问题可能更明显了:这并不容易。如果它确实是格式错误的 HTML,您可能需要手动完成这项工作,直到可以将其输入 HTML 解析器。然后,您可以使用此处介绍的任何其他模块来完成这项工作。尽管您不可能以编程方式将原始 HTML 转换为严格有效的 xhtml。

于 2009-10-27T23:26:05.040 回答