2010-10-09 15 views
5

pQuery es un puerto pragmático del marco de JavaScript jQuery para Perl que se puede utilizar para el raspado de la pantalla.¿Cómo hago que pQuery funcione con HTML ligeramente deformado?

pQuery bastante sensible al HTML mal formado. Consideremos el siguiente ejemplo:

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 no va a encontrar la etiqueta del título en el ejemplo anterior, debido a la doble ">>" en el código HTML con formato incorrecto.

Para hacer que mis aplicaciones basadas en pQuery sean más tolerantes al HTML mal formado, necesito preprocesar el HTML limpiándolo antes de pasarlo a pQuery.

Comenzando con el fragmento de código dado anteriormente, ¿cuál es la forma más robusta de puro perl para limpiar el HTML para que lo analice: capaz por pQuery?

Respuesta

4

Me gustaría informar de esto como un error en pQuery. Aquí hay una solución:

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"; 

Esto no tiene mucho sentido, ya que ya se utiliza pQueryHTML::TreeBuilder como su mecanismo de análisis subyacente, pero funciona.

2

Pruebe HTML::Tidy, que corrige el código HTML no válido.

+0

Lo siento, pero necesito una solución de puro perl. Ahora se ha aclarado en la pregunta. Gracias por la respuesta de todos modos! :-) – knorv

-1

es eso lo que quieres?

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

No, eso solo captaría el ejemplo dado. Estoy buscando una solución más general. – knorv

Cuestiones relacionadas