Как вы справляетесь с искаженным HTML в Perl? - PullRequest
5 голосов
/ 27 октября 2009

Мне интересен синтаксический анализатор, который может взять неправильно сформированную HTML-страницу и превратить ее в правильно сформированный HTML-код перед выполнением некоторых запросов XPath. Вы знаете кого-нибудь?

Ответы [ 3 ]

13 голосов
/ 28 октября 2009

Вы не должны использовать анализатор 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).

1 голос
/ 28 октября 2009

Вы можете перефразировать вопрос следующим образом:

Мне интересен парсер, который может взять искаженный HTML-страницу C-источника и превратить его в правильно сформированный HTML C-источник перед выполнением некоторых XPath-запросов сборник и ссылки на него. Вы знаете кого-нибудь?

Теперь вопрос может быть немного более очевидным: это будет непросто. Если это действительно искаженный HTML, возможно, вам придется выполнять работу вручную, пока она не будет передана в анализатор HTML. Затем вы можете использовать любой из других модулей, представленных здесь, чтобы сделать работу. Маловероятно, однако, что вы когда-нибудь могли бы программно перевести необработанный HTML-код в строго допустимый xhtml.

1 голос
/ 28 октября 2009

Если вы не хотите узнать больше о колесах , используйте код HTML Tidy .

...