Desidero estrarre alcuni dati dall'HTML e quindi essere in grado di evidenziare elementi estratti sul lato client senza modificare l'html di origine. E XPath o CSS Path è perfetto per questo. È possibile estrarre XPATH o CSS Path direttamente da BeautifulSoup?
In questo momento, utilizzo la marcatura dell'elemento target e quindi lxml lib per estrarre xpath, il che è molto negativo per le prestazioni. So di BSXPath.py
- non funziona con BS4. La soluzione con la riscrittura di tutto per utilizzare la lib di lxml nativa non è accettabile a causa della complessità.Estratto BeautifulSoup XPATH o CSS Percorso del nodo
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
Risposta breve: no, non esiste un metodo esistente per questo. Dovrai costruirlo da solo. –