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.
Ich kann bestätigen, dass es in Beautiful Soup keine XPath-Unterstützung gibt.
quelle
Wie andere gesagt haben, hat BeautifulSoup keine xpath-Unterstützung. Es gibt wahrscheinlich eine Reihe von Möglichkeiten, etwas von einem xpath zu erhalten, einschließlich der Verwendung von Selen. Hier ist jedoch eine Lösung, die entweder in Python 2 oder 3 funktioniert:
Ich habe dies als Referenz verwendet.
quelle
urllib2
Bibliotheksverwendung in Python 3 übersetzt habenurllib.request
?BeautifulSoup hat eine Funktion namens findNext von aktuellem Element gerichtet childern, also:
Der obige Code kann den folgenden xpath imitieren:
quelle
Ich habe ihre Dokumente durchsucht und es scheint, dass es keine xpath-Option gibt. Wie Sie hier bei einer ähnlichen Frage zu SO sehen können, bittet das OP um eine Übersetzung von xpath nach BeautifulSoup. Mein Fazit wäre also: Nein, es ist keine xpath-Analyse verfügbar.
quelle
Wenn Sie lxml verwenden, ist alles ganz einfach:
Aber wenn Sie BeautifulSoup BS4 verwenden, ist das auch ganz einfach:
Probieren Sie diese Magie aus:
Wie Sie sehen, unterstützt dies kein Sub-Tag, daher entferne ich den Teil "/ @ href"
quelle
select()
ist für CSS-Selektoren, es ist überhaupt nicht XPath. Wie Sie sehen, unterstützt dies kein Sub-Tag. Obwohl ich nicht sicher bin, ob dies zu diesem Zeitpunkt der Fall war, ist dies jetzt sicherlich nicht der Fall.Vielleicht können Sie Folgendes ohne XPath versuchen
quelle
Oben verwendet die Kombination von Soup-Objekt mit lxml und man kann den Wert mit xpath extrahieren
quelle
Dies ist ein ziemlich alter Thread, aber es gibt jetzt eine Umgehungslösung, die zu diesem Zeitpunkt möglicherweise noch nicht in BeautifulSoup enthalten war.
Hier ist ein Beispiel dafür, was ich getan habe. Ich verwende das Modul "Anfragen", um einen RSS-Feed zu lesen und seinen Textinhalt in einer Variablen namens "rss_text" abzurufen. Damit starte ich es durch BeautifulSoup, suche nach xpath / rss / channel / title und rufe seinen Inhalt ab. Es ist nicht gerade XPath in seiner ganzen Pracht (Platzhalter, mehrere Pfade usw.), aber wenn Sie nur einen einfachen Pfad haben, den Sie suchen möchten, funktioniert dies.
quelle