Нет, BeautifulSoup сам по себе не поддерживает выражения XPath.
Альтернативная библиотека, lxml, поддерживает XPath 1.0. У него есть совместимый с BeautifulSoup режим, в котором он пытается анализировать поврежденный HTML так, как это делает Soup. Однако анализатор 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; класс 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.
person
Martijn Pieters
schedule
13.07.2012