2009-10-30 15 views
5

duplicado posible:
Can you provide an example of parsing HTML with your favorite parser?
How can I extract content from HTML files using Perl?¿Cómo puedo extraer datos de tablas HTML en Perl?


Estoy tratando de utilizar expresiones regulares en Perl para analizar una tabla con la siguiente estructura. La primera línea es la siguiente:

<tr class="Highlight"><td>Time Played</a></td><td></td><td>Artist</td><td width="1%"></td><td>Title</td><td>Label</td></tr> 

Aquí deseo de sacar "Tiempo jugado", "Artista", "Título" y "Etiqueta", e imprimirlos a un archivo de salida.

¡Cualquier ayuda sería muy apreciada!

Ok lo siento ... He intentado muchas expresiones regulares tales como:

$lines =~/(<td>)/
     OR 
$lines =~/<td>(.*)</
     OR 
$lines =~/>(.*)</

Mi programa actual se ve así:

#!perl -w 

open INPUT_FILE, "<", "FIRST_LINE_OF_OUTPUT.txt" or die $!; 

open OUTPUT_FILE, ">>", "PLAYLIST_TABLE.txt" or die $!; 

my $lines = join '', <INPUT_FILE>; 

print "Hello 2\n"; 

if ($lines =~/(\S.*\S) /) { 
print "this is 1: \n"; 
print $1; 
    if ($lines =~/<td>(.*)< /) { 
    print "this is the 2nd 1: \n"; 
    print $1; 
    print "the word was: $1.\n"; 
    $Time = $1; 
    print $Time; 
    print OUTPUT_FILE $Time; 
    } else { 
    print "2ND IF FAILED\n"; 
    } 
} else { 
print "THIS FAILED\n"; 
} 

close(INPUT_FILE); 
close(OUTPUT_FILE); 
+0

Duplicado de http://stackoverflow.com/questions/1406891/how-can-i-extract-content-from-html-files-using-perl –

+0

No es realmente un duplicado de esa pregunta. –

+0

@Kinopiko: lo suficientemente cerca. ¿Cuál es la diferencia entre querer extraer porciones entre etiquetas td y etiquetas li? –

Respuesta

16

NO utilice expresiones regulares para analizar HTML. Hay una gran cantidad de módulos de CPAN que hacen esto por usted de manera mucho más efectiva.

+0

En este caso, el análisis solicitado es bastante simple. –

+1

@Ether Me parece que algunas personas disfrutan torturándose a sí mismas. No sé por qué. –

+2

@Sinan: Mi teoría es que hay un tipo especial de curva de aprendizaje con expresiones regulares: al principio parecen tan alucinantes que no hay nada que no puedan (o no deberían) hacer. Cualquier cosa que parezca un problema de análisis, por lo tanto * debe * ser solucionable con expresiones regulares. – Ether

0

Eso es fácil:

my $html = '<tr class="Highlight"><td>Time Played</a></td><td></td><td>Artist</td><td width="1%"></td><td>Title</td><td>Label</td></tr>'; 
my @stuff = $html =~ />([^<]+)</g; 
print join (", ", @stuff), "\n"; 

Consulte http://codepad.org/qz9d5Bro si quiere intentar ejecutarlo.

+0

Espera hasta que veas DOWNVOTES que recibo por decirte esto. –

+0

¿por qué? y probé que funciona ... gracias :) – nick

+3

@nick porque este es el tipo de enfoque que mantendrá un desperdicio mucho más tiempo y esfuerzo una y otra vez siempre buscando la expresión regular correcta cada vez que se necesita analizar HTML. –

11

Utilice HTML::TableExtract. De Verdad.

#!/usr/bin/perl 

use strict; 
use warnings; 

use HTML::TableExtract; 
use LWP::Simple; 

my $file = 'Table3.htm'; 
unless (-e $file) { 
    my $rc = getstore(
     'http://www.ntsb.gov/aviation/Table3.htm', 
     $file); 
    die "Failed to download document\n" unless $rc == 200; 
} 

my @headers = qw(Year Fatalities); 

my $te = HTML::TableExtract->new(
    headers => \@headers, 
    attribs => { id => 'myTable' }, 
); 

$te->parse_file($file); 

my ($table) = $te->tables; 

print join("\t", @headers), "\n"; 

for my $row ($te->rows) { 
    print join("\t", @$row), "\n"; 
} 

Esto es lo que quise decir en otra publicación de analizadores de HTML "específicos de la tarea".

Podrías haber ahorrado mucho tiempo dirigiendo tu energía a leer alguna documentación en lugar de arrojar expresiones mágicas en la pared y ver si hay alguna atascada.

+0

Sé que llego muy tarde a esta fiesta pero el 'getstore()' es un toque muy agradable para evitar golpear al servidor de alguien. Gran código de muestra. – Ashley

+0

He votado esto porque proporcionó código de trabajo, aunque estuve tentado de no hacerlo porque no pudo resistirse a dar una conferencia al OP al final. Saber qué documentación leer no es tan fácil. –

+1

@SueSpence Gracias por el voto popular, pero las personas que siguen arrojando patrones uno tras otro en los documentos HTML cuyo formato no está bajo su control, necesitan que se les recuerde que hay mejores soluciones. ¿Puedo recomendarle que agregue código de trabajo a [su respuesta] (http://stackoverflow.com/a/12603602/100754) sobre el tema, en lugar de sermonear acerca de no dar conferencias a otros? –

Cuestiones relacionadas