[python] Können wir Xpath mit BeautifulSoup verwenden?



2 Answers

Ich kann bestätigen, dass es in Beautiful Soup keine XPath-Unterstützung gibt.

Question

Ich benutze BeautifulSoup, um eine URL zu scrappen und ich hatte den folgenden Code

import urllib
import urllib2
from BeautifulSoup import BeautifulSoup

url =  "http://www.example.com/servlet/av/ResultTemplate=AVResult.html"
req = urllib2.Request(url)
response = urllib2.urlopen(req)
the_page = response.read()
soup = BeautifulSoup(the_page)
soup.findAll('td',attrs={'class':'empformbody'})

Im obigen Code können wir findAll , um Tags und Informationen zu erhalten, aber ich möchte xpath verwenden. Ist es möglich, Xpath mit BeautifulSoup zu verwenden? Wenn möglich, kann mir bitte jemand einen Beispielcode geben, damit es hilfreicher ist?




BeautifulSoup hat eine Funktion namens findNext von aktuellen Element-gesteuerten childern, also:

father.findNext('div',{'class':'class_value'}).findNext('div',{'id':'id_value'}).findAll('a') 

Der obige Code kann den folgenden xpath imitieren:

div[class=class_value]/div[id=id_value]



Dies ist ein ziemlich alter Thread, aber es gibt jetzt eine Lösung, die zu dieser Zeit noch nicht in BeautifulSoup war.

Hier ist ein Beispiel von dem, was ich getan habe. Ich benutze das Modul "Anfragen", um einen RSS-Feed zu lesen und seinen Textinhalt in einer Variablen namens "rss_text" abzurufen. Damit führe ich es durch BeautifulSoup, suche nach dem xpath / rss / channel / title und lade seinen Inhalt ab. Es ist nicht genau XPath in seiner ganzen Pracht (Wildcards, mehrere Pfade, etc.), aber wenn Sie nur einen grundlegenden Pfad haben, den Sie finden möchten, funktioniert das.

from bs4 import BeautifulSoup
rss_obj = BeautifulSoup(rss_text, 'xml')
cls.title = rss_obj.rss.channel.title.get_text()



Related