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 response
Objekt 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 requests
Bibliothek zu tun , möchten Sie stream=True
das response.raw
Objekt 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 CSSSelector
Klasse übersetzt CSS-Anweisungen in XPath-Ausdrücke, was die Suche td.empformbody
erheblich 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.