122 votes

pouvons-nous utiliser xpath avec BeautifulSoup?

J'utilise beautifulsoup pour gratter une URL et j'avais le code suivant

 import urllib
import urllib2
from BeautifulSoup import BeautifulSoup

url =  "http://www.example.com/servlet/av/ResultTemplate=AVResult.html"
req = urllib2.Request(url)
response = urllib2.urlopen(req)
the_page = response.read()
soup = BeautifulSoup(the_page)
soup.findAll('td',attrs={'class':'empformbody'})
 

Maintenant, dans le code ci-dessus, nous pouvons utiliser findAll pour obtenir des balises et des informations les concernant, mais je souhaite utiliser xpath car il est possible d’utiliser xpath avec beautifulsoup. Si possible, veuillez vous fournir un exemple de code afin: que ce sera plus utile.

Merci d'avance.....

196voto

Martijn Pieters Points 271458

Nope, BeautifulSoup, par lui-même, ne prend pas en charge les expressions XPath.

Une bibliothèque alternative, lxml, n' support de XPath 1.0. Il a un BeautifulSoup compatible mode où il va essayer de l'analyser rompu HTML de la manière la Soupe n'. Toutefois, le défaut lxml HTML parser fait juste le bon emploi de l'analyse rompu HTML, et je crois qu'il est plus rapide.

Une fois que vous avez analysé votre document en un lxml arbre, vous pouvez utiliser l' .xpath() méthode de recherche pour les éléments.

import urllib2
from lxml import etree

url =  "http://www.example.com/servlet/av/ResultTemplate=AVResult.html"
response = urllib2.urlopen(url)
htmlparser = etree.HTMLParser()
tree = etree.parse(response, htmlparser)
tree.xpath(xpathselector)

D'intérêt possible pour vous, c'est le Sélecteur CSS de soutien; l' CSSSelector classe se traduit par CSS dans les expressions XPath, ce qui rend votre recherche d' td.empformbody beaucoup plus facile:

from lxml.cssselect import CSSSelector

td_empformbody = CSSSelector('td.empformbody')
for elem in td_empformbody(tree):
    # Do something with these table cells.

Boucler la boucle: BeautifulSoup lui-même n' en ont assez décent sélecteur CSS de soutien:

for cell in soup.select('table#foobar td.empformbody'):
    # Do something with these table cells.

153voto

Leonard Richardson Points 1266

Je peux confirmer qu'il n'y a pas de support XPath dans Beautiful Soup.

18voto

user3820561 Points 1

BeautifulSoup a une fonction nommée findNext issue de l'élément courant dirigé vers l'enfant, donc:

 father.findNext('div',{'class':'class_value'}).findNext('div',{'id':'id_value'}).findAll('a') 
 

Le code ci-dessus peut imiter xpath (div [div = class_value] / div [id = id_value])

1voto

Nikola Points 2491

J'ai cherché dans leurs documents et il semble qu'il n'y ait pas d'option xpath. En outre, comme vous pouvez le voir ici sur une question similaire sur SO, l'OP demande une traduction de xpath vers BeautifulSoup. Ma conclusion est donc: non, aucune analyse xpath n'est disponible.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X