Non, BeautifulSoup, à lui seul, ne prend pas en charge les expressions XPath.
Une bibliothèque alternative, lxml , prend en charge XPath 1.0. Il a un mode compatible BeautifulSoup où il essaiera d'analyser le HTML cassé comme le fait Soup. Cependant, l' analyseur HTML lxml par défaut fait tout aussi bien un travail d'analyse du HTML cassé, et je pense qu'il est plus rapide.
Une fois que vous avez analysé votre document dans une arborescence lxml, vous pouvez utiliser la .xpath()
méthode pour rechercher des éléments.
try:
# Python 2
from urllib2 import urlopen
except ImportError:
from urllib.request import urlopen
from lxml import etree
url = "http://www.example.com/servlet/av/ResultTemplate=AVResult.html"
response = urlopen(url)
htmlparser = etree.HTMLParser()
tree = etree.parse(response, htmlparser)
tree.xpath(xpathselector)
Il existe également un module dédiélxml.html()
avec des fonctionnalités supplémentaires.
Notez que dans l'exemple ci-dessus, j'ai passé l' response
objet directement à lxml
, car il est plus efficace de lire l'analyseur directement à partir du flux que de lire d'abord la réponse dans une grande chaîne. Pour faire de même avec la requests
bibliothèque, vous souhaitez définir stream=True
et transmettre l' response.raw
objet après avoir activé la décompression transparente du transport :
import lxml.html
import requests
url = "http://www.example.com/servlet/av/ResultTemplate=AVResult.html"
response = requests.get(url, stream=True)
response.raw.decode_content = True
tree = lxml.html.parse(response.raw)
Le support du sélecteur CSS peut vous intéresser ; la CSSSelector
classe traduit les instructions CSS en expressions XPath, ce td.empformbody
qui facilite grandement votre recherche :
from lxml.cssselect import CSSSelector
td_empformbody = CSSSelector('td.empformbody')
for elem in td_empformbody(tree):
# Do something with these table cells.
La boucle est bouclée : BeautifulSoup lui - même prend en charge le sélecteur CSS très complet :
for cell in soup.select('table#foobar td.empformbody'):
# Do something with these table cells.