Frage

Ich versuche, zusammen stellen eine einfache HTML-Schaber für eine Vielzahl von wissenschaftlichen Zeitschrift Websites, insbesondere die abstrakte oder einleitenden Absatz zu bekommen versuchen.

Die aktuelle Zeitschrift arbeite ich an ist Natur, und der Artikel, den ich verwendet habe, als meine Probe a href gesehen werden kann unter <= "http://www.nature.com/nature/journal/v463/ n7284 / abs / nature08715.html“rel = "nofollow noreferrer"> http://www.nature.com/nature/journal/v463/n7284/abs/nature08715.html .

Ich kann nicht den abstrakten aus dieser Seite erhalten, jedoch. Ich suche alles zwischen den <p class="lead">...</p> Tags, aber ich kann nicht scheinen, um herauszufinden, wie sie zu isolieren. Ich dachte, es wäre etwas Einfaches wie

sein
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

Mit Python 2.5, BeautifulSoup 3.0.8, das gibt 'Keine' läuft. Ich habe keine Möglichkeit, etwas anderes mit, dass Bedürfnisse (wie lxml) kompiliert / installiert werden. Ist BeautifulSoup verwirrt, oder bin ich?

War es hilfreich?

Lösung

Das HTML ist ziemlich malformed und xml.dom.minidom kann nicht analysieren, und BeautifulSoup Parsen nicht gut funktioniert.

Ich entfernte einige <!-- ... --> Teile und Parse wieder mit BeautifulSoup, dann scheint es besser, und in der Lage soup.find('p', attrs={'class' : 'lead'})

laufen

Hier ist der Code Ich habe versucht,

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

Andere Tipps

Hier ist ein nicht BS Weg, um die abstrakten zu bekommen.

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"))
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top