Нет, 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 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.
Я могу подтвердить, что в Beautiful Soup нет поддержки XPath.
источник
Как уже говорили другие, BeautifulSoup не поддерживает xpath. Вероятно, есть несколько способов получить что-то из xpath, включая использование Selenium. Однако вот решение, которое работает как в Python 2, так и в 3:
Я использовал это как ссылку.
источник
urllib2
библиотеки на Python 3urllib.request
?BeautifulSoup имеет функцию с именем findNext из текущего элемента, направленного на childern, поэтому:
Приведенный выше код может имитировать следующий xpath:
источник
Я просмотрел их документы и, похоже, там нет опции xpath. Кроме того, как вы можете видеть здесь по аналогичному вопросу о SO, OP запрашивает перевод с xpath на BeautifulSoup, поэтому мой вывод будет - нет, синтаксический анализ xpath недоступен.
источник
при использовании lxml все просто:
но при использовании BeautifulSoup BS4 тоже все просто:
попробуйте эту магию:
как видите, это не поддерживает подтег, поэтому я удаляю часть "/ @ href"
источник
select()
предназначен для селекторов CSS, это вообще не XPath. как вы видите, это не поддерживает подтег. Хотя я не уверен, было ли это правдой в то время, но точно не сейчас.Возможно, вы можете попробовать следующее без XPath
источник
Выше использовалась комбинация объекта Soup с lxml, и можно извлечь значение с помощью xpath
источник
Это довольно старый поток, но сейчас есть временное решение, которого, возможно, не было в BeautifulSoup в то время.
Вот пример того, что я сделал. Я использую модуль «запросы» для чтения RSS-канала и получения его текстового содержимого в переменной с именем «rss_text». После этого я запускаю его через BeautifulSoup, ищу xpath / rss / channel / title и получаю его содержимое. Это не совсем XPath во всей красе (подстановочные знаки, множественные пути и т. Д.), Но если у вас есть только базовый путь, который вы хотите найти, это работает.
источник