tutorial scraping pagina leer instalar examples español python beautifulsoup html-content-extraction

pagina - web scraping python español



Obteniendo BeautifulSoup para encontrar un<p> específico (2)

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

El diario actual en el que estoy trabajando es Nature, y el artículo que he estado usando como muestra se puede ver en http://www.nature.com/nature/journal/v463/n7284/abs/nature08715.html .

Sin embargo, no puedo sacar el resumen de esa página. Estoy buscando todo entre las etiquetas <p class="lead">...</p> , pero parece que no puedo averiguar cómo aislarlas. Pensé que sería algo 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

Al usar Python 2.5, BeautifulSoup 3.0.8, al ejecutar esto se devuelve ''Ninguno''. No tengo opción de usar cualquier otra cosa que necesite compilarse / instalarse (como lxml). ¿BeautifulSoup está confundido, o soy yo?


Ese html está bastante mal formado, y xml.dom.minidom no puede analizar y el análisis de BeautiFulSoup no funciona bien.

Quité algunas partes <!-- ... --> y analicé de nuevo con BeautiFulSoup, entonces parece mejor y puedo ejecutar soup.find(''p'', attrs={''class'' : ''lead''})

Aquí está el código que 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 .....


aquí hay una forma 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"))