Nie, sama BeautifulSoup nie obsługuje wyrażeń XPath.
Alternatywą biblioteka, lxml , czy wsparcie XPath 1.0. Ma tryb kompatybilny z BeautifulSoup, w którym spróbuje przeanalizować uszkodzony kod HTML tak, jak robi to Soup. Jednak domyślny parser lxml HTML równie dobrze radzi sobie z analizowaniem uszkodzonego kodu HTML i uważam, że jest szybszy.
Po przeanalizowaniu dokumentu w drzewie lxml możesz użyć tej .xpath()
metody do wyszukiwania elementów.
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)
Istnieje również dedykowany lxml.html()
moduł z dodatkową funkcjonalnością.
Zauważ, że w powyższym przykładzie przekazałem response
obiekt bezpośrednio do lxml
, ponieważ odczytanie parsera bezpośrednio ze strumienia jest bardziej wydajne niż wczytanie odpowiedzi najpierw do dużego ciągu. Aby zrobić to samo z requests
biblioteką, chcesz ustawić stream=True
i przekazać response.raw
obiekt po włączeniu przezroczystej dekompresji transportu :
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)
Może Cię zainteresować obsługa selektora CSS ; CSSSelector
klasa przekłada wypowiedzi CSS w wyrażeniach XPath, dzięki czemu wyszukiwanie za td.empformbody
to o wiele łatwiejsze:
from lxml.cssselect import CSSSelector
td_empformbody = CSSSelector('td.empformbody')
for elem in td_empformbody(tree):
# Do something with these table cells.
Nadchodzi pełne koło: Sam BeautifulSoup ma mieć bardzo kompletne wsparcie selektora CSS :
for cell in soup.select('table#foobar td.empformbody'):
# Do something with these table cells.
Mogę potwierdzić, że w Beautiful Soup nie ma obsługi XPath.
źródło
Jak powiedzieli inni, BeautifulSoup nie obsługuje xpath. Prawdopodobnie istnieje wiele sposobów na uzyskanie czegoś z xpath, w tym użycie selenu. Oto jednak rozwiązanie, które działa w Pythonie 2 lub 3:
Użyłem tego jako odniesienia.
źródło
urllib2
bibliotekę na Python 3urllib.request
?BeautifulSoup ma funkcję o nazwie findNext z bieżącego elementu skierowanego podrzędny, więc:
Powyższy kod może imitować następującą ścieżkę xpath:
źródło
Przeszukałem ich dokumenty i wygląda na to, że nie ma opcji xpath. Także, jak widać tutaj na podobne pytanie na SO, OP prosi o przetłumaczenie z XPath do BeautifulSoup, więc mój wniosek będzie - nie ma, nie ma XPath parsowania dostępny.
źródło
kiedy używasz lxml wszystko proste:
ale kiedy używasz BeautifulSoup BS4, wszystko jest również proste:
spróbuj tej magii:
jak widzisz, to nie obsługuje tagu podrzędnego, więc usuwam część „/ @ href”
źródło
select()
jest dla selektorów CSS, w ogóle nie jest XPath. jak widać, to nie obsługuje tagu podrzędnego. Chociaż nie jestem pewien, czy wtedy było to prawdą, z pewnością nie jest teraz.Może możesz wypróbować następujące rozwiązania bez XPath
źródło
Powyżej użyto kombinacji obiektu Soup z lxml i można wyodrębnić wartość za pomocą xpath
źródło
To dość stary wątek, ale obecnie istnieje rozwiązanie obejściowe, którego być może nie było w tym czasie w BeautifulSoup.
Oto przykład tego, co zrobiłem. Używam modułu "request" do czytania kanału RSS i pobierania jego zawartości tekstowej w zmiennej o nazwie "rss_text". Dzięki temu uruchamiam go przez BeautifulSoup, wyszukuję xpath / rss / channel / title i pobieram jego zawartość. To nie jest dokładnie XPath w całej okazałości (symbole wieloznaczne, wiele ścieżek itp.), Ale jeśli masz tylko podstawową ścieżkę, którą chcesz zlokalizować, to działa.
źródło