2012-03-20 27 views
12

Necesito extraer datos de archivos HTML. Los archivos en cuestión son, muy probablemente, generados automáticamente. He cargado el código de uno de estos archivos a Pastebin: http://pastebin.com/9Nj2Edfv. Este es el enlace a la página actual: http://eur-lex.europa.eu/Notice.do?checktexts=checkbox&val=60504%3Acs&pos=1&page=1&lang=en&pgs=10&nbl=1&list=60504%3Acs%2C&hwords=&action=GO&visu=%23texteExtraer datos de archivos HTML con BeautifulSoup y Python

Los datos que necesito extraer se encuentran bajo los diferentes encabezados.

Esto es lo que tengo hasta ahora:

from BeautifulSoup import BeautifulSoup 
ecj_data = open("data\ecj_1.html",'r').read() 

soup = BeautifulSoup(ecj_data) 

celex = soup.find('h1') 
auth_lang = soup('ul', limit=14)[13].li 
procedure = soup('ul', limit=20)[17].li 

print "Celex number:", celex.renderContents(), 
print "Authentic language:", auth_lang 
print "Type of procedure:", procedure 

tengo todos los datos almacenados localmente, que es la razón por la que se abre el archivo ecj_1.html.

El número de Celex y el lenguaje Auténtico funcionan bastante bien.

celex devuelve

"Celex number: 
61977J0059" 

auth_lang devuelve "Authentic language: <li>French</li>"

I necesita sólo el contenido de la etiqueta h1 (no de la pausa al final).

[También, necesito auth_lang para volver sólo "francés", y no los <li> creada.] Esto no es un problema más. Me di cuenta de que solo podía agregar ".text" al final de "auth_lang".

Procedimiento por el contrario devuelve este:

Type of procedure: <li> 
    <strong>Type of procedure:</strong> 
    <br /> 
    Reference for a preliminary ruling 
    </li> 

que es bastante malo como acabo lo necesito para volver "Petición de decisión preliminar".

¿Hay alguna manera de que pueda lograrlo?

Segunda edición: que sustituyen celex = soup.find('h1') con celex = soup('h1', limit=2)[0] y ha añadido .text a la celex impresión.

Respuesta

3

El contenido de cada una de las secuencias encontradas son listas, solo las dos primeras son de longitud 1. Sin embargo, procedure tiene 5 elementos y la entrada que busca (en este caso) es la 4ta. He usado splitlines() para deshacerme de las nuevas líneas también.

print "Celex number:", celex.contents[0].splitlines()[1] 
print "Authentic language:", auth_lang.contents[0].splitlines()[0] 
print "Type of procedure:", procedure.contents[4].splitlines()[1] 

de salida:

Celex number: 61977J0059 
Authentic language: French 
Type of procedure: Reference for a preliminary ruling 
+0

Fraxel: Muchas gracias! Funciona a las mil maravillas. La idea es transferir de algún modo el resultado de este archivo a una base de datos. Creo que es posible que haya resuelto un problema en el futuro cuando me mostró cómo deshacerse de las nuevas líneas, ya que es probable que arruinen algo más adelante. ¡Gracias de nuevo! – A2D2

Cuestiones relacionadas