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.
Puedo confirmar que no hay soporte XPath dentro de Beautiful Soup.
fuente
Como han dicho otros, BeautifulSoup no tiene soporte para xpath. Probablemente hay varias formas de obtener algo de un xpath, incluido el uso de Selenium. Sin embargo, aquí hay una solución que funciona en Python 2 o 3:
Usé esto como referencia.
fuente
urllib2
uso de la biblioteca a Python 3urllib.request
?BeautifulSoup tiene una función llamada findNext del elemento actual dirigido childern, por lo que:
El código anterior puede imitar el siguiente xpath:
fuente
He buscado en sus documentos y parece que no hay una opción xpath. Además, como puede ver aquí en una pregunta similar sobre SO, el OP solicita una traducción de xpath a BeautifulSoup, por lo que mi conclusión sería: no, no hay análisis de xpath disponible.
fuente
cuando usas lxml todo simple:
pero cuando usa BeautifulSoup BS4 también es simple:
prueba esta magia:
como puede ver, esto no es compatible con la subetiqueta, así que elimino la parte "/ @ href"
fuente
select()
es para selectores CSS, no es XPath en absoluto. como puede ver, esto no es compatible con la subetiqueta. Aunque no estoy seguro de si eso era cierto en ese momento, ciertamente no lo es ahora.Tal vez puedas probar lo siguiente sin XPath
fuente
Anteriormente se usó la combinación del objeto Soup con lxml y se puede extraer el valor usando xpath
fuente
Este es un hilo bastante antiguo, pero ahora hay una solución alternativa, que puede que no estuviera en BeautifulSoup en ese momento.
He aquí un ejemplo de lo que hice. Utilizo el módulo "solicitudes" para leer una fuente RSS y obtener su contenido de texto en una variable llamada "rss_text". Con eso, lo ejecuto a través de BeautifulSoup, busco xpath / rss / channel / title y recupero su contenido. No es exactamente XPath en todo su esplendor (comodines, múltiples rutas, etc.), pero si solo tiene una ruta básica que desea ubicar, esto funciona.
fuente