8
votes

Python Web raclage impliquant des balises HTML avec des attributs

J'essaie de créer un grattoir Web qui analysera une page Web de publications et extraire les auteurs. La structure squelettique de la page Web est la suivante:

    import re
    import urllib2,sys
    import lxml
    from lxml import etree
    from lxml.html.soupparser import fromstring
    from lxml.etree import tostring
    from lxml.cssselect import CSSSelector
    from BeautifulSoup import BeautifulSoup, NavigableString

    address='http://www.example.com/'
    html = urllib2.urlopen(address).read()
    soup = BeautifulSoup(html)
    html=soup.prettify()
    html=html.replace('&nbsp', '&#160')
    html=html.replace('&iacute','&#237')
    root=fromstring(html)


0 commentaires

4 Réponses :


12
votes

Ce n'est pas clair pour moi de votre question pourquoi vous devez vous inquiéter des balises div code> - Qu'en est-il de:

thetds = soup.findAll('td', attrs={'class': 'author'})
for thetd in thetds:
    print thetd.string


1 commentaires

Merci, Alex. J'ai plusieurs auteurs sur la page, alors je vais avoir plusieurs tags TD. Comment puis-je itération sur chacun d'eux?



1
votes

beauxoupe est certainement l'analyseur / processeur HTML canonique. Mais si vous avez juste ce type d'extrait, vous devez faire correspondre, au lieu de construire un objet hiérarchique entier représentant le HTML, PyparSing facilite la définition des balises HTML principales et suivantes dans le cadre de la création d'une expression de recherche plus importante:

from pyparsing import makeHTMLTags, withAttribute, SkipTo

author_td, end_td = makeHTMLTags("td")

# only interested in <td>'s where class="author"
author_td.setParseAction(withAttribute(("class","author")))

search = author_td + SkipTo(end_td)("body") + end_td

for match in search.searchString(html):
    print match.body


0 commentaires

6
votes

Ou vous pouvez utiliser PYQUERY, car BELLESUP n'est plus entretenu activement, voir http://www.crummy.com/software/beautifulsoup/3.1-problems.html

Tout d'abord, installez la pyquery avec p> xxx pré>

alors votre script pourrait Soyez aussi simple que P>

from pyquery import PyQuery
d = PyQuery('http://mywebpage/')
allauthors = [ td.text() for td in d('td.author') ]


0 commentaires

5
votes

La bibliothèque LXML est maintenant la norme pour analyse HTML en Python. L'interface peut sembler maladroite au début, mais elle est très utilisée pour ce qu'elle fait.

Vous devez laisser la liberge de gérer le spécialiste XML, telle que celles évasées et entités; xxx


0 commentaires