Pergunta

Estou tentando montar um raspador HTML básico para uma variedade de sites de periódicos científicos, tentando especificamente obter o parágrafo abstrato ou introdutório.

O diário atual em que estou trabalhando é a natureza, e o artigo que tenho usado como minha amostra pode ser vista http://www.nature.com/nature/journal/v463/n7284/abs/nature08715.html.

Não consigo tirar o resumo dessa página, no entanto. Estou procurando tudo entre o <p class="lead">...</p> Tags, mas não consigo descobrir como isolá -las. Eu pensei que seria algo simples 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

Usando o Python 2.5, o BeautifulSoup 3.0.8, executando isso retorna 'nenhum'. Não tenho opção de usar mais nada que precise ser compilado/instalado (como LXML). BeautifulSoup está confuso, ou estou?

Foi útil?

Solução

Que o HTML é praticamente malformado e o XML.DOM.Minidom não pode analisar, e o belo grupo de parsing não está funcionando bem.

Eu removi alguns <!-- ... --> peças e analisar novamente com o belo grupo, então parece melhor e capaz de correr soup.find('p', attrs={'class' : 'lead'})

Aqui está o código que tentei

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

Outras dicas

Aqui está uma maneira não BS de obter o resumo.

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"))
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top