2010-10-09 15 views
5

pQuery è una porta pragmatica del framework jQuery JavaScript in Perl che può essere utilizzata per lo screen scraping.Come faccio a far funzionare pQuery con HTML leggermente malformato?

pQuery molto sensibile a HTML non valido. Si consideri il seguente esempio:

use pQuery; 

my $html_malformed = "<html><head><title>foo</title></head><body>bar</body></html>>"; 
my $page = pQuery($html_malformed); 
my $title = $page->find("title"); 
print "The title is: ", $title->html, "\n"; 

pQuery non troverà il tag title nell'esempio di cui sopra a causa del doppio ">>" nel codice HTML valido.

Per rendere le mie applicazioni basate su pQuery più tolleranti per l'HTML non valido Ho bisogno di pre-elaborare l'HTML pulendolo prima di passarlo a pQuery.

A partire dal frammento di codice sopra riportato, qual è il modo più puro e puro per pulire l'HTML per renderlo analizzato: abile da pQuery?

risposta

4

Lo segnalerei come un errore in pQuery. Ecco una soluzione:

use HTML::TreeBuilder; 
use pQuery; 

my $html_malformed = "<html><head><title>foo</title></head><body>bar</body></html>>"; 
my $html_cleaned = HTML::TreeBuilder->new_from_content($html_malformed); 
my $page = pQuery($html_cleaned->as_HTML); 
$html_cleaned->delete; 
my $title = $page->find("title"); 
print "The title is: ", $title->html, "\n"; 

Questo non ha molto senso, dal momento che già utilizza pQueryHTML::TreeBuilder come meccanismo di analisi di fondo, ma funziona.

2

Provare HTML::Tidy, che corregge l'HTML non valido.

+0

Scusa, ma ho bisogno di una soluzione perl pure. Ora è stato chiarito nella domanda. Grazie comunque per la risposta! :-) – knorv

-1

è quello che vuoi?

$html_malformed =~ r|<+(<.*?>)>+|$1|g; 
+0

No, sarebbe solo prendere l'esempio dato. Sto cercando una soluzione più generale. – knorv

Problemi correlati