Pregunta

Estoy tratando de armar un HTML básico rascador para una variedad de sitios web de revistas científicas, tratando específicamente para obtener el párrafo abstracto o introductoria.

La revista actual que estoy trabajando es la naturaleza, y el artículo que he estado utilizando como mi muestra se puede considerar en http://www.nature.com/nature/journal/v463/n7284/abs/nature08715.html .

No se puede obtener la salida abstracta de esa página, sin embargo. Estoy en busca de todo lo que entre las etiquetas <p class="lead">...</p>, pero me parece que no puede encontrar la manera de aislarlos. Pensé que iba a ser algo tan simple como

from BeautifulSoup import BeautifulSoup
import re
import urllib2

address="http://www.nature.com/nature/journal/v463/n7284/full/nature08715.html"
html = urllib2.urlopen(address).read()
soup = BeautifulSoup(html)

abstract = soup.find('p', attrs={'class' : 'lead'})
print abstract

Uso de Python 2.5, BeautifulSoup 3.0.8, corriendo 'None' Esto devuelve. No tengo ninguna opción de usar cualquier otra cosa que necesita ser compilado / instalado (como lxml). BeautifulSoup es confuso, o soy yo?

¿Fue útil?

Solución

Eso HTML es más o menos mal formados, y xml.dom.minidom no puede analizar y BeautifulSoup análisis no funciona bien.

Me retirado algunas partes <!-- ... --> y análisis sintáctico de nuevo con BeautifulSoup, entonces su mejor y parece capaz de ejecutar soup.find('p', attrs={'class' : 'lead'})

Este es el código Probé

>>> html =re.sub(re.compile("<!--.*?-->",re.DOTALL),"",html)
>>>
>>> soup=BeautifulSoup(html)
>>>
>>> soup.find('p', attrs={'class' : 'lead'})
<p class="lead">The class of exotic Jupiter-mass planets that orb  .....

Otros consejos

aquí está una manera no BS para obtener el resumen.

address="http://www.nature.com/nature/journal/v463/n7284/full/nature08715.html"
html = urllib2.urlopen(address).read()
for para in html.split("</p>"):
    if '<p class="lead">' in para:
        abstract=para.split('<p class="lead">')[1:][0]
        print ' '.join(abstract.split("\n"))
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top