No, BeautifulSoup, di per sé, non supporta le espressioni XPath.
Una libreria alternativa, lxml , fa il supporto XPath 1.0. Ha una modalità compatibile con BeautifulSoup in cui proverà ad analizzare l'HTML rotto come fa Soup. Tuttavia, il parser HTML lxml predefinito fa altrettanto bene l'analisi dell'HTML rotto e credo sia più veloce.
Dopo aver analizzato il documento in un albero lxml, puoi utilizzare il .xpath()
metodo per cercare gli elementi.
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)
C'è anche un modulo dedicatolxml.html()
con funzionalità aggiuntive.
Si noti che nell'esempio sopra ho passato l' response
oggetto direttamente a lxml
, poiché avere il parser letto direttamente dal flusso è più efficiente che leggere prima la risposta in una stringa grande. Per fare lo stesso con la requests
libreria, vuoi impostare stream=True
e passare l' response.raw
oggetto dopo aver abilitato la decompressione del trasporto trasparente :
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)
Di possibile interesse per te è il supporto del selettore CSS ; la CSSSelector
classe traduce le istruzioni CSS in espressioni XPath, rendendo la tua ricerca td.empformbody
molto più semplice:
from lxml.cssselect import CSSSelector
td_empformbody = CSSSelector('td.empformbody')
for elem in td_empformbody(tree):
# Do something with these table cells.
Venendo al punto di partenza: BeautifulSoup in sé non ha molto completo supporto selettore CSS :
for cell in soup.select('table#foobar td.empformbody'):
# Do something with these table cells.