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.