Chcę wyodrębnić niektóre dane z HTML, a następnie być w stanie podświetlić wyodrębnione elementy po stronie klienta bez modyfikowania źródłowego html. Ścieżka XPath lub CSS wygląda świetnie. Czy można wyodrębnić ścieżkę XPATH lub CSS bezpośrednio z BeautifulSoup? Obecnie używam oznaczania elementu docelowego, a następnie biblioteki lxml, aby wyodrębnić ścieżkę xpath, co jest bardzo niekorzystne dla wydajności. Wiem o BSXPath.py
- to nie działa z BS4. Rozwiązanie polegające na przepisywaniu wszystkiego w celu użycia natywnej biblioteki LXML jest niedopuszczalne ze względu na złożoność.BeautifulSoup extract XPATH lub CSS Ścieżka węzła
import bs4
import cStringIO
import random
from lxml import etree
def get_xpath(soup, element):
_id = random.getrandbits(32)
for e in soup():
if e == element:
e['data-xpath'] = _id
break
else:
raise LookupError('Cannot find {} in {}'.format(element, soup))
content = unicode(soup)
doc = etree.parse(cStringIO.StringIO(content), etree.HTMLParser())
element = doc.xpath('//*[@data-xpath="{}"]'.format(_id))
assert len(element) == 1
element = element[0]
xpath = doc.getpath(element)
return xpath
soup = bs4.BeautifulSoup('<div id=i>hello, <b id=i test=t>world!</b></div>')
xpath = get_xpath(soup, soup.div.b)
assert '//html/bodydiv/b' == xpath
Krótka odpowiedź: nie, nie istnieje żadna istniejąca metoda. Musisz to zbudować samodzielnie. –