我对一个可以处理格式错误的HTML页面的解析器感兴趣,并在对它执行一些XPath查询之前将其转换为格式良好的HTML。你知道吗?
答案 0 :(得分: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:\Temp> z cell 1 cell 2 cell 3 cell 4
这里的关键点是HTML解析器将文档解析为HTML文档(尽管我们能够使用XPath查询它)。
答案 1 :(得分:1)
除非您关注learn more about wheels,否则请使用HTML Tidy代码。
答案 2 :(得分:1)
你可以改写这样的问题:
我对可能采用格式错误的
HTML页C源的解析器感兴趣,并在执行某些XPath之前将其转换为格式良好的编译和链接。你知道吗?HTMLC源代码查询
现在问题可能更明显一点:这并不容易。如果它确实是格式错误的HTML,您可能需要手动完成工作,直到它可以被输入HTML解析器。然后,您可以使用此处提供的任何其他模块来完成工作。虽然你不可能以编程方式将原始HTML翻译成严格有效的xhtml。