Parser de HTML a XML
Hola a todos, estos dias estoy intentando sacar la informacion de la programacion de la web de ETB para tener un fichero XMLTV.
La pagina en cuestion es esta: http://www.eitb.com/es/television/programacion/
Lo que quiero es poder tener la informacion en modo XMLTV, y despues poder añadir en el MythTV.
He empezado a hacer un script en bash:
1. Primero descargo la pagina con "wget".
2. Despues con "grep" y "sed" intento eliminar todas las lineas que no quiero, pero tengo problemas ya que no tengo suficiente habilidad para hacerlo, sobre todo en tema de tabulaciones y saltos de linea.
Os pongo como es la web y como quiero que quede (un trozo):
(con las tabulaciones y saltos de linea)
<li class="expandible">
<span class="ico"></span>
<p class="hora">07:45</p>
<h2 class="titulo">
La noche de... - <span class="titulo_emision"></span> <span class="ico"></span>
</h2>
<!-- <p class="links"><a href="">Web</a> | <a href="">Vídeo</a> | <a href="">Blog</a></p>-->
<!-- <p class="a_la_carta "><a href=""><span>alacarta</span></a></p> -->
<div class="detalles">
<!--<img src="../../img/foto_100_80.jpg" alt="" />-->
<div class="texto sin_imagen">
<p class="titulo_emision"></p>
<p class="entradilla">Programa de cine presentado por Felix Linares con reportajes sobre actores, directores y peliculas; variadas secciones que ayudan a descubrir aspectos desconocidos del séptimo arte. </p>
</div>
<!-- <ul>
<li class="web"><a href=""><span class="ico"></span>Web del contenido</a></li>
<li class="recordar"><a href=""><span class="ico"></span>Recordar emisión</a></li>
</ul> -->
</div>
</li>
(la informacion que necesito)
<p class="hora">07:45</p>
<h2 class="titulo">La noche de...</h2>
<p class="entradilla">Programa de cine presentado por Felix Linares con reportajes sobre actores, directores y peliculas; variadas secciones que ayudan a descubrir aspectos desconocidos del séptimo arte. </p>(como quiero que quede)
<programme channel="etbsat" start="20111031220000 +0100" stop="20111101000000 +0100">
<title>La noche de...</title>
<desc>Programa de cine presentado por Felix Linares con reportajes sobre actores, directores y peliculas; variadas secciones que ayudan a descubrir aspectos desconocidos del séptimo arte.</desc>
</programme>Lo que me interesa es guargar en variables los parametros "hora", "titulo" y "entradilla" del HTML, despues creo que ya se como generar el fichero XMLTV.
¿Existe alguna manera sencilla de hacer esto?
Muchismas gracias por todo y hasta pronto.
Saludos!!!
- Inicie sesión o regístrese para enviar comentarios
- 333 lecturas


Hola de nuevo, estoy bloqueado en un paso, el tema es que tengo un salto de linea que lo quiero quitar:
<p class="hora">08:00</p><h2 class="titulo">
Egun on Euskadi - <span class="titulo_emision"></span> <span class="ico"></span>
Lo quiero dejar asi:
<p class="hora">08:00</p><h2 class="titulo">Egun on Euskadi - <span class="titulo_emision"></span> <span class="ico"></span>
He probado con "sed" y "tr", pero no me sale, he leido que existen dos tipos de saltos de linea diferentes (dos y unix).
He probado asi: (pero no funciona)
sed -i 's/^M$//' $file2tr -d "\n" < $file2 > $file3
Con "gedit" lo puedo hacer reemplazando lo primero por lo segundo:
<h2 class="titulo">\r\n<h2 class="titulo">
Pero lo quiero hacer en bash para ponerlo en el cron.
¿Como lo puedo hacer?
Saludos!
No es exactamente lo que pides, pero reemplazar los caracteres nueva línea por espacios es muy sencillo en bash,
echo $(cat $file2)daría como resultado,
<p class="hora">08:00</p> <h2 class="titulo"> Egun on Euskadi - <span class="titulo_emision"></span> <span class="ico"></span>Una cadena sin saltos de línea, reemplazando cada salto de línea por un espacio.
¿No sería más fácil si usas un programa tipo elinks?
elinks -dump http://www.eitb.com/es/television/programacion/ | grep -v '\(\*\|\<[0-9]*\.\>\|^$\)ya sólo con esa expresión regular te quitarías la mayoría de basura y podrías tratar lo que queda en bloques que empiecen en mañana y acaben en mañana para hacer el fichero de cada canal, o algo por el estilo.
Te todas formas, si te mola la opción de wget, creo que con algo así (mejorado) podrías conseguir casi lo que quieres:
wget -q http://www.eitb.com/es/television/programacion/ -O - |tr -d '\t' |
grep '^<p class="canal"\|^<p class="hora"\|^<p class="titulo_emision"\|^<p class="entradilla"'
Gracias a los dos!
Con esto me va perfecto:
wget -q http://www.eitb.com/es/television/programacion/ -O - |tr -d '\t' |
grep '^<p class="canal"\|^<p class="hora"\|^<p class="titulo_emision"\|^<p class="entradilla"'
Mañana lo pruebo y os comento como me queda, pero creo que con esto ya lo tengo.
Muchisimas gracias!!!
Hola de nuevo, he modificado el comnado para que me entienda mejor:
#!/bin/bashurl="http://www.eitb.com/es/television/programacion/"
file1="etbsat1.txt"
file2="etbsat2.txt"
file3="etbsat3.txt"
file4="etbsat4.txt"
rm $file1
rm $file2
rm $file3
rm $file4
wget $url -O $file1
cp $file1 $file2
cat $file2 | tr -d '\t' > $file3
cat $file3 | grep '^<p class="canal"\|^<p class="hora"\|^<p class="titulo_emision"\|^<p class="entradilla"' > $file4
Ahora tengo algo asi: (las ultimas lineas)
<p class="hora">06:00</p><p class="titulo_emision"></p>
<p class="entradilla">Recital musical.</p>
Pero el problema es que el original es algo asi:
<p class="hora">06:00</p><h2 class="titulo">
Musika gauak jazz - <span class="titulo_emision"></span> <span class="ico"></span>
</h2>
<!-- <p class="links"><a href="">Web</a> | <a href="">Vídeo</a> | <a href="">Blog</a></p>
<p class="a_la_carta"><a href=""><strong>EITB</strong> a la carta</a></p>-->
<div class="detalles">
<!--<img src="../../img/foto_100_80.jpg" alt="" />-->
<div class="texto">
<p class="titulo_emision"></p>
<p class="entradilla">Recital musical.</p>
Y la idea es que quede algo asi:
<p class="hora">06:00</p><h2 class="titulo">Musika gauak jazz - <span class="titulo_emision"></span> <span class="ico"></span>
<p class="entradilla">Recital musical.</p>
Lo que me da problemas es poner en la misma linea la etiqueta class="titulo" con lo que viene a continuacion.
Seguire con ello, pero la verdad que no tengo mucha idea. Agradezco vuestra ayuda.
Muchas gracias por todo y hasta pronto.
Saludos.
Pues la verdad no me había fijado mucho en la estructura del texto, así que con algo así en lugar de la regex que te puse anteriormente te saldría bastante mejor:
wget $url -O | tr -d '\t\015' | grep -A10 -B1 '<h2 class="titulo">' | grep -v '^<!\|^$\|^</'Lo del carácter \015 es por el M que aparece al final de todas las líneas (se puede ver con cat -v FILE o con vim).
Y algo relacionado con el script:
No hace falta que hagas los rm's del principio, ya que todo el tiempo sobreescribes lo que hubiese.
Muchas gracias por responder, lo siento por la tardanza, pero no se porque no me llegan correos de las notificaciones.
Creo que ya casi lo tengo, pero tengo un problema con las comillas. Tengo todas las variables bien guardadas, pero al escribir las comillas me hago un lio. lo que quiero es poder escribir algo asi:
<programme channel="etbsat" start="20111110214500 +0100" stop="20111110220000 +0100"><title lang="es">Title</title>
<desc>Description</desc>
</programme>
Tengo las variables asi:
$hora$horafin
$titulo
$descripcion
Lo que hago es escribirlo asi:
while read A;do
#Aqui pongo bien las variables con sed, cut, y grep: $hora,$horafin, $titulo y $descriptcion
#Escribir hora
if echo "$A" | grep -q '<p class="hora">'
then
echo `<programme channel="etbsat" start="$hora +0100" stop="$horafin +0100">`
fi
#Escribir titulo
if echo "$A" | grep -q '<p class="titulo_emision">'
then
echo `<title lang="es">$titulo</title>`
fi
#Escribir descripcion
if echo "$A" | grep -q '<p class="entradilla">'
then
echo `<desc>$descripcion</desc>`
echo `</programme>`
fi
done < $file
Lo que hago es redirigir este script a un fichero, y ya tengo el XMLTV generado, pero como os digo me estoy liando con las comillas.
Muchas gracias por todo y hasta pronto.
Saludos.
Duplicado, perdon
Y la idea es que quede algo asi:
<p class="hora">06:00</p><h2 class="titulo">Musika gauak jazz - <span class="titulo_emision"></span> <span class="ico"></span>
<p class="entradilla">Recital musical.</p>
Saludos.
Solo un detalle, te falta cerrar el h2, seria así
<p class="hora">06:00</p><h2 class="titulo">Musika gauak jazz - <span class="titulo_emision"></span> <span class="ico"></span></h2>
<p class="entradilla">Recital musical.</p>
Por otra parte si luego no vas a escribir nada en esos span ,mejor que los elimines tambien
Varias cosas:
1.- Lo primero la variable que le pasas a "echo" no hace falta que vaya entrecomillada, ya que acepta un número variable de parámetros.
2.- No se a qué te refieres específicamente con tu problema de comillas, pero supongo que te referirás a que no puedes obtener el valor de la variable dentro de las comillas simples, lo que tienes que hacer es concatenar los strings.
echo 'parte_literal'"$VAR"'parte_literal'