No, BeautifulSoup, por sí solo, no admite expresiones XPath.
Una biblioteca alternativa, lxml , hace apoyo XPath 1.0. Tiene un modo compatible con BeautifulSoup en el que intentará analizar HTML roto como lo hace Soup. Sin embargo, el analizador HTML lxml predeterminado hace un buen trabajo al analizar HTML roto, y creo que es más rápido.
Una vez que haya analizado su documento en un árbol lxml, puede usar el .xpath()método para buscar elementos.
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)
También hay un módulo dedicadolxml.html() con funcionalidad adicional.
Tenga en cuenta que en el ejemplo anterior le pasé el responseobjeto directamente lxml, ya que hacer que el analizador lea directamente de la secuencia es más eficiente que leer primero la respuesta en una cadena grande. Para hacer lo mismo con la requestsbiblioteca, desea establecer stream=Truey pasar el response.rawobjeto después de habilitar la descompresión de transporte transparente :
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)
De posible interés para usted es el soporte de CSS Selector ; la CSSSelectorclase traduce declaraciones CSS en expresiones XPath, lo td.empformbodyque facilita mucho la búsqueda :
from lxml.cssselect import CSSSelector
td_empformbody = CSSSelector('td.empformbody')
for elem in td_empformbody(tree):
# Do something with these table cells.
Cerrando el círculo: sí BeautifulSoup no tiene muy completo apoyo selector CSS :
for cell in soup.select('table#foobar td.empformbody'):
# Do something with these table cells.