Question

Je suis en train de mettre en place un grattoir HTML de base pour une variété de sites de revues scientifiques, en essayant d'obtenir plus précisément le paragraphe abstrait ou d'introduction.

La revue actuelle je travaille est la nature et l'article que je me sers de mon échantillon peut être vue à http://www.nature.com/nature/journal/v463/n7284/abs/nature08715.html .

Je ne peux pas l'abstrait sur cette page, cependant. Je cherche tout entre les balises <p class="lead">...</p>, mais je ne peux pas sembler comprendre comment les isoler. Je pensais que ce serait quelque chose de simple comme

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

En utilisant Python 2.5, BeautifulSoup 3.0.8, l'exécution de cette retourne 'None'. Je n'ai pas possibilité d'utiliser toute autre chose qui doit être compilé / installé (comme lxml). BeautifulSoup est confus, ou suis-je?

Était-ce utile?

La solution

Ce html est à peu près malformé, et xml.dom.minidom ne peut pas analyser et beautifulsoup l'analyse syntaxique ne fonctionne pas bien.

J'ai enlevé quelques pièces <!-- ... --> et parser à nouveau avec beautifulsoup, alors son semble mieux et en mesure d'exécuter soup.find('p', attrs={'class' : 'lead'})

Voici le code que j'ai essayé

>>> 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  .....

Autres conseils

Voici une façon non BS pour obtenir l'abstrait.

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"))
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top