Ні, BeautifulSoup сам по собі не підтримує вирази XPath.
Альтернативна бібліотека, LXML , робить підтримку XPath 1.0. У ньому є режим, сумісний з BeautifulSoup, де він буде намагатися розбирати зламаний HTML, як робить Суп. Однак HTML-аналізатор lxml за замовчуванням робить так само хорошу роботу з розбору зламаного HTML, і я вважаю, що це швидше.
Після того, як ви розібрали документ у дереві lxml, ви можете скористатися .xpath()
методом пошуку елементів.
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)
Також є виділений lxml.html()
модуль з додатковою функціональністю.
Зауважте, що у наведеному вище прикладі я передав response
об'єкт безпосередньо lxml
, оскільки аналізатор зчитування прямо з потоку є більш ефективним, ніж спочатку зчитування відповіді у великій рядку. Щоб зробити те ж саме з requests
бібліотекою, потрібно встановити stream=True
та передати response.raw
об’єкт після включення прозорої транспортної декомпресії :
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)
Можлива для вас цікава підтримка CSS Selector ; CSSSelector
клас переводить оператори CSS в виразах XPath, що робить Ваш пошук , td.empformbody
що набагато простіше:
from lxml.cssselect import CSSSelector
td_empformbody = CSSSelector('td.empformbody')
for elem in td_empformbody(tree):
# Do something with these table cells.
Пройшовши повне коло: сам BeautifulSoup має дуже повну підтримку CSS селектор :
for cell in soup.select('table#foobar td.empformbody'):
# Do something with these table cells.