Avec lxml.html
vous pouvez appeler le parse
directement avec une adresse URL afin de ne pas avoir à appeler le urllib
. En outre, au lieu d'utiliser find
ou findall
vous aurez envie d'appeler xpath
de sorte que vous obtenez le full expressiveness of xpath; Si vous essayez d'appeler la même expression ci-dessous en utilisant find
, une erreur invalid predicate
s'affichera.
#!/usr/bin/env python
import lxml.html
url = "http://www.yellowpages.com.au/search/listings?clue=architects&locationClue=New+South+Wales&x=45&y=12"
tree = lxml.html.parse(url)
listings = tree.xpath("//span[contains(@id,'listing-name-')]/text()")
print listings
Affichera cela, la préservation de l'ordre:
['Cape Cod Australia Pty Ltd',
'BHI',
'Fibrent Pty Ltd Building & Engineering Assessments',
...
'Archicentre']
Pour répondre à la question dans vos commentaires à ma réponse, ce que vous voulez rechercher est le <div class="listingInfoContainer">...</div>
qui contient toutes les informations que vous voulez . (le nom, l'adresse, etc.) Vous pouvez ensuite parcourir la liste des éléments div correspondant à ces critères et utiliser les expressions xpath pour extraire le reste des informations. Notez que dans ce cas j'utilise container.xpath('.//span')
qui va chercher depuis le noeud courant (le container div), sinon si vous omettez le .
et juste //span
il commencera la recherche depuis le haut de l'arbre et vous obtiendrez une liste de tous les éléments qui correspondent, ce qui n'est pas ce que vous voulez quand vous sélectionnez le nœud du conteneur.
#!/usr/bin/env python
import lxml.html
url = "http://www.yellowpages.com.au/search/listings?clue=architects&locationClue=New+South+Wales&x=45&y=12"
tree = lxml.html.parse(url)
container = tree.xpath("//div[@class='listingInfoContainer']")
listings = []
for c in container:
data = {}
data['name'] = c.xpath('.//span[contains(@id,"listing")]/text()')
data['address'] = c.xpath('.//span[@class="address"]/text()')
listings.append(data)
print listings
qui sort:
[{'name': ['Cape Cod Australia Pty Ltd'],
'address': ['4th Floor 410 Church St, North Parramatta NSW 2151']},
{'name': ['BHI'],
'address': ['Suite 5, 65 Doody St, Alexandria NSW 2015']},
{'name': ['Fibrent Pty Ltd Building & Engineering Assessments'],
'address': ["Suite 3B, Level 1, 72 O'Riordan St, Alexandria NSW 2015"]},
...
{'name': ['Archicentre'],
'address': ['\n Level 3, 60 Collins St\n ',
'\n Melbourne VIC 3000\n ']}]
qui est une liste (encore une fois, préserver l'ordre de la façon dont vous voulez) des dictionnaires avec les touches name
et address
que contiennent chacun une liste. Cette liste finale est renvoyée par text()
qui préserve les caractères de nouvelle ligne \n
dans le code HTML d'origine et traduit des éléments tels que <br>
en un nouvel élément de liste. Un exemple de pourquoi il le fait est l'élément de la liste, Archicentre, où la représentation HTML original est:
<span class="address">
Level 3, 60 Collins St
<br/>
Melbourne VIC 3000
</span>
essayer 'page.read()' et voir êtes-vous en mesure de récupérer le contenu de la page – RanRag
Je voudrais d'abord télécharger la page à la machine locale, puis travailler sur la partie analyse et enfin si c'est prêt, branchez le fichier distant de lecture ... – plaes