2009-10-27 13 views
5

Jestem zainteresowany analizatorem składni, który może wykonać zniekształconą stronę HTML i przekształcić ją w dobrze sformatowany kod HTML przed wykonaniem niektórych zapytań XPath. Czy znasz jakieś?Jak radzisz sobie ze źle sformułowanym kodem HTML w Perlu?

+0

Zależy od tego, co próbujesz zrobić. Rutynowo analizuję dziesiątki gigabajtów zniekształconego źródła HTML, nie martwiąc się o nic z tego. –

+0

Jak się masz? Próbowałem użyć XML :: XPath w połączeniu z LWP :: UserAgent, a XML :: XPath nie powiodło się ze zepsutym błędem. Może chcesz opublikować swoją strategię jako odpowiedź. – Geo

+1

Odpowiedź zależy od konkretnego zadania. Twoje pytanie jest zbyt ogólnikowe, by dać konkretną odpowiedź. Najpierw jednak nie próbuj parsować HTML jako XML. Użyj parsera HTML. –

Odpowiedz

13

Nie należy używać analizatora XML do parsowania kodu HTML. Użyj parsera HTML.

Należy pamiętać, że poniższe nie jest całkowicie poprawny HTML (i parser będzie dusić na nim):

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

Istnieje wiele specyficznych zadań (oprócz ogólnego przeznaczenia) parser HTML na CPAN. Działają doskonale dla mnie w ogromnej różnorodności niezwykle nieuporządkowanych (i przez większość czasu nieważnych) HTML.

Można podać konkretne zalecenia, jeśli można określić problem, który próbujesz rozwiązać.

Istnieje również , który używa HTML::Parser do parsowania dokumentu do drzewa, a następnie pozwala na zapytanie go za pomocą XPath. Nigdy go nie używałem, ale zobacz Randal Schwartz's HTML Scraping with XPath.

Biorąc pod uwagę powyższy plik HTML, co następuje krótki scenariusz:

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

wyjścia:

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

Kluczową kwestią jest to, że dokument został przeanalizowany przez parser HTML jako dokument HTML (pomimo tego, że byliśmy w stanie wysłać zapytanie za pomocą XPath).

1

Jeśli nie szukasz learn more about wheels, użyj kodu HTML Tidy.

+1

Z ogromną ilością parsera zadania dostępnego dla programisty Perla, rzadko jest to konieczne. –

+0

Minęło 5 lat, odkąd ostatni raz pracowałem z Perlem ... zgadnij, co to jest. – AnonJr

1

Można przeformułować pytanie tak:

Jestem zainteresowany parsera, który mógłby podjąć nieprawidłowy HTML strony C źródła i przekształcić go w dobrze uformowane HTML C Źródło przed wykonaniem część XPath pyta o kompilację kompilacji i linkowania. Czy znasz jakieś?

Teraz pytanie może być nieco bardziej oczywiste: to nie będzie łatwe. Jeśli jest to naprawdę zniekształcony kod HTML, może być konieczne ręczne wykonanie pracy, dopóki nie zostanie ona przekazana do analizatora składni HTML. Następnie możesz użyć dowolnego z przedstawionych tutaj modułów do wykonania pracy. Jest jednak mało prawdopodobne, że kiedykolwiek można programowo przetłumaczyć surowy HTML na ściśle prawidłowy xhtml.

Powiązane problemy