2009-10-27 15 views
5

Me interesa un analizador que podría tomar una página HTML mal formada y convertirla en HTML bien formado antes de realizar algunas consultas XPath en él. ¿Sabes de alguno?¿Cómo se maneja el HTML con formato incorrecto en Perl?

+0

Depende de lo que estés tratando de hacer. Analizo rutinariamente decenas de gigabytes de código fuente de código HTML sin preocuparme por nada de eso. –

+0

¿Cómo estás? Traté de usar XML :: XPath en combinación con LWP :: UserAgent, y XML :: XPath falló con un error de formato incorrecto. Tal vez le gustaría publicar su estrategia como una respuesta. – Geo

+1

La respuesta depende de la tarea específica en cuestión. Su pregunta es demasiado vaga para dar una respuesta específica. Primero, sin embargo, no intente analizar HTML como XML. Use un analizador HTML. –

Respuesta

13

No debe usar un analizador XML para analizar HTML. Use un analizador HTML.

cuenta que la siguiente es perfectamente válida HTML (y un analizador XML sería ahogarse en él):

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

Hay muchas tareas específicas (además del propósito general) analizadores HTML en CPAN. Han funcionado perfectamente para mí en una inmensa variedad de HTML extremadamente desordenado (y la mayoría de las veces no es válido).

Sería posible dar recomendaciones específicas si puede especificar el problema que está tratando de resolver.

También hay HTML::TreeBuilder::XPath que usa HTML::Parser para analizar el documento en un árbol y luego le permite consultarlo usando XPath. Nunca lo he usado, pero veo el HTML Scraping with XPath de Randal Schwartz.

Dado el archivo HTML anterior, la escritura siguiente resumen:

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

salidas:

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

El punto clave aquí es que el documento fue analizado por un analizador de HTML como un documento HTML (a pesar de que pudimos consultarlo usando XPath).

1

A menos que esté buscando learn more about wheels, utilice el código HTML Tidy.

+1

Con la plétora de analizador de tareas específicas disponible para un programador de Perl, que rara vez es necesario. –

+0

Han pasado 5 años desde la última vez que trabajé con Perl ... supongo que se nota. – AnonJr

1

se podría volver a la pregunta de esta manera:

estoy interesado en un programa de análisis que podría tomar una página fuente HTML mal formado C, y convertirlo en HTML bien formado fuente de C antes de realizar algunos consultas XPath compilación y vinculación en él. ¿Sabes de alguno?

Ahora la pregunta puede ser un poco más obvia: no será fácil. Si se trata de HTML malformado, es posible que deba hacer el trabajo a mano hasta que pueda alimentarlo en un analizador HTML. Luego, puede usar cualquiera de los otros módulos presentados aquí para hacer el trabajo. Sin embargo, es poco probable que puedas traducir programáticamente HTML sin formato a xhtml estrictamente válido.

Cuestiones relacionadas