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 response
objeto 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 requests
biblioteca, desea establecer stream=True
y pasar el response.raw
objeto 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 CSSSelector
clase traduce declaraciones CSS en expresiones XPath, lo td.empformbody
que 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.