-
22-09-2019 - |
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
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?
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'})
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"))