2009-10-27 8 views
5

Ich bin an einem Parser interessiert, der eine fehlerhafte HTML-Seite erstellen und in gut formatierten HTML-Code umwandeln kann, bevor einige XPath-Abfragen ausgeführt werden. Kennst du irgendwelche?Wie behandeln Sie fehlerhafte HTML in Perl?

+0

Hängt davon ab, was Sie versuchen zu tun. Ich parsen routinemäßig mehrere zehn Gigabyte an entstellter HTML-Quelle, ohne sich darum zu kümmern. –

+0

Wie geht es dir? Ich habe versucht, XML :: XPath in Kombination mit LWP :: UserAgent zu verwenden, und XML :: XPath ist mit einem fehlerhaften Fehler fehlgeschlagen. Vielleicht möchten Sie Ihre Strategie als Antwort veröffentlichen. – Geo

+1

Die Antwort hängt von der spezifischen Aufgabe ab. Ihre Frage ist zu vage, um eine konkrete Antwort zu geben. Versuchen Sie jedoch zunächst nicht, HTML als XML zu analysieren. Verwenden Sie einen HTML-Parser. –

Antwort

13

Sie sollten keinen XML-Parser verwenden, um HTML zu analysieren. Verwenden Sie einen HTML-Parser.

Beachten Sie, dass die folgende ist absolut gültige HTML (und ein XML-Parser daran ersticken würde):

<!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> 

Es gibt viele spezifische Aufgabe (zusätzlich zu dem allgemeinen Zweck) HTML-Parser auf CPAN. Sie haben perfekt für mich auf eine immense Vielfalt von extrem chaotisch (und meistens ungültig) HTML gearbeitet.

Es wäre möglich, spezifische Empfehlungen zu geben, wenn Sie das Problem angeben können, das Sie lösen möchten.

Es gibt auch HTML::TreeBuilder::XPath, die HTML::Parser verwendet, um das Dokument in einem Baum zu analysieren und dann ermöglicht es, es mithilfe von XPath abzufragen. Ich habe es nie benutzt, aber siehe Randal Schwartz HTML Scraping with XPath.

die HTML-Datei oben gegeben, die folgende kurze Skript:

#!/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; 

Ausgänge:

 
C:\Temp> z 
cell 1 
cell 2 
cell 3 
cell 4 

Der entscheidende Punkt ist hier, dass das Dokument von einem HTML-Parser als HTML-Dokument analysiert wurde (trotz der Tatsache, dass wir es mit XPath abfragen konnten).

1

Wenn Sie nicht nach learn more about wheels suchen, verwenden Sie den Code HTML Tidy.

+1

Mit der Fülle von Task-spezifischen Parser für einen Perl-Programmierer, das ist selten erforderlich. –

+0

Es ist 5 Jahre her, seit ich das letzte Mal mit Perl gearbeitet habe ... denke mal. – AnonJr

1

Man könnte die Frage wie diese anders formulieren:

Ich habe Interesse an einem Parser, der eine ungültige HTML-Seite C-Quelle übernehmen könnte, und schalen Sie sich in gut HTML C-Quelle gebildet vor der Durchführung einige XPath Abfragen Kompilierung und Verknüpfung darauf. Kennst du irgendwelche?

Jetzt kann die Frage etwas offensichtlicher sein: Es wird nicht einfach sein. Wenn es sich wirklich um falsch formatiertes HTML handelt, müssen Sie die Arbeit möglicherweise manuell durchführen, bis sie in einen HTML-Parser eingegeben werden kann. Dann können Sie eines der anderen hier vorgestellten Module verwenden, um die Arbeit zu erledigen. Es ist jedoch unwahrscheinlich, dass Sie jemals rohen HTML-Code programmatisch in strikt gültige xhtml übersetzen können.

Verwandte Themen