Вы не должны использовать анализатор 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. Я никогда не использовал его, но вижу HTML Scraping с 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).