Nein, BeautifulSoup selbst unterstützt keine XPath-Ausdrücke.
Eine alternative Bibliothek, lxml , tut Unterstützung XPath 1.0. Es verfügt über einen BeautifulSoup-kompatiblen Modus, in dem versucht wird, fehlerhaftes HTML wie Soup zu analysieren. Der Standard-HTML-Parser lxml kann jedoch genauso gut fehlerhaftes HTML analysieren , und ich glaube, er ist schneller.
Sobald Sie Ihr Dokument in einen lxml-Baum analysiert haben, können Sie mit der .xpath()Methode nach Elementen suchen.
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)
Es gibt auch ein spezielles lxml.html()Modul mit zusätzlichen Funktionen.
Beachten Sie, dass ich im obigen Beispiel das responseObjekt direkt an übergeben habe lxml, da es effizienter ist, den Parser direkt aus dem Stream zu lesen, als die Antwort zuerst in eine große Zeichenfolge einzulesen. Um dasselbe mit der requestsBibliothek zu tun , möchten Sie stream=Truedas response.rawObjekt festlegen und übergeben, nachdem Sie die transparente Transportdekomprimierung aktiviert haben :
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)
Von möglichem Interesse für Sie ist die Unterstützung von CSS Selector . Die CSSSelectorKlasse übersetzt CSS-Anweisungen in XPath-Ausdrücke, was die Suche td.empformbodyerheblich erleichtert:
from lxml.cssselect import CSSSelector
td_empformbody = CSSSelector('td.empformbody')
for elem in td_empformbody(tree):
# Do something with these table cells.
Der Kreis schließt sich : BeautifulSoup selbst bietet eine sehr umfassende Unterstützung für die CSS-Auswahl :
for cell in soup.select('table#foobar td.empformbody'):
# Do something with these table cells.