-
22-09-2019 - |
Domanda
Sto cercando di mettere insieme un raschietto HTML di base per una serie di siti web di riviste scientifiche, in particolare cercando di ottenere il paragrafo introduttivo astratto o.
La rivista corrente su cui sto lavorando è la Natura, e l'articolo ho usato il mio campione può essere visto all'indirizzo http://www.nature.com/nature/journal/v463/n7284/abs/nature08715.html .
Non riesco a ottenere il riassunto di quella pagina, tuttavia. Sto cercando tutto tra i tag <p class="lead">...</p>
, ma io non riesco a capire come per isolarli. Ho pensato che sarebbe stato qualcosa di semplice come
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
Utilizzando Python 2.5, BeautifulSoup 3.0.8, l'esecuzione di questo ritorna 'Nessuno'. Non ho possibilità di utilizzare qualsiasi altra cosa che deve essere compilato / installato (come lxml). È BeautifulSoup confuso, o sono io?
Soluzione
che HTML è praticamente deforme, e xml.dom.minidom non può analizzare, e BeautifulSoup analisi non funziona bene.
Ho rimosso alcune parti <!-- ... -->
e analizzo di nuovo con BeautifulSoup, allora la sua sembra migliore e in grado di eseguire soup.find('p', attrs={'class' : 'lead'})
Ecco il codice che ho provato
>>> 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 .....
Altri suggerimenti
Ecco un modo non BS per ottenere l'astratto.
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"))