можно ли использовать xpath с BeautifulSoup?

Я использую BeautifulSoup, чтобы очистить URL-адрес, и у меня был следующий код

import urllib import urllib2 from BeautifulSoup import BeautifulSoup url = "http://www.example.com/servlet/av/ResultTemplate=AVResult.html" req = urllib2.Request(url) response = urllib2.urlopen(req) the_page = response.read() soup = BeautifulSoup(the_page) soup.findAll('td',attrs={'class':'empformbody'}) 

Теперь в приведенном выше коде мы можем использовать findAll для получения тегов и информации, связанной с ними, но я хочу использовать xpath, можно ли использовать xpath с BeautifulSoup, если возможно, кто-нибудь может предоставить мне пример кода, чтобы он был более полезным ,

5 Solutions collect form web for “можно ли использовать xpath с BeautifulSoup?”

Нет, BeautifulSoup сам по себе не поддерживает выражения XPath.

Альтернативная библиотека, lxml , поддерживает XPath 1.0. Он поддерживает режим BeautifulSoup, где он попытается разобрать сломанный HTML, как делает Суп. Тем не менее, по умолчанию lxml HTML-парсер отлично справляется с разборчивым HTML-кодом , и я считаю, что это быстрее.

После того как вы проанализировали свой документ в дереве lxml, вы можете использовать метод .xpath() для поиска элементов.

 import urllib2 from lxml import etree url = "http://www.example.com/servlet/av/ResultTemplate=AVResult.html" response = urllib2.urlopen(url) htmlparser = etree.HTMLParser() tree = etree.parse(response, htmlparser) tree.xpath(xpathselector) 

Вас может заинтересовать поддержка 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.

Код Martijn больше не работает должным образом (ему уже 4+ года …), etree.parse() печатает на консоль и не присваивает значение переменной tree . Ссылаясь на это , я смог выяснить это, используя запросы и lxml:

 from lxml import html import requests page = requests.get('http://econpy.pythonanywhere.com/ex/001.html') tree = html.fromstring(page.content) #This will create a list of buyers: buyers = tree.xpath('//div[@title="buyer-name"]/text()') #This will create a list of prices prices = tree.xpath('//span[@class="item-price"]/text()') print 'Buyers: ', buyers print 'Prices: ', prices 

Функция BeautifulSoup имеет функцию с именем findNext из текущего элемента direct childern, поэтому:

 father.findNext('div',{'class':'class_value'}).findNext('div',{'id':'id_value'}).findAll('a') 

Выше код может имитировать следующий xpath:

 div[class=class_value]/div[id=id_value] 

Я просматривал их документы, и, похоже, нет опции xpath. Кроме того, как вы можете видеть здесь по аналогичному вопросу о SO, OP просит перевод с xpath на BeautifulSoup, поэтому мой вывод будет: нет, нет синтаксического анализа xpath.

  • Как сформулировать выражение Xpath для получения атрибута из дочернего узла?
  • Как получить описание работы с помощью scrapy?
  • Запрос python xml get parent
  • Пустой список с scrapy и Xpath
  • Почему этот xpath не работает с использованием lxml в python?
  • извлечение только-родственного элемента в xpath
  • Xpath vs DOM vs BeautifulSoup vs lxml vs other Какой самый быстрый подход к анализу веб-страницы?
  • Как сопоставить содержимое элемента в XPath (lxml)?
  • Python - лучший язык программирования в мире.