【发布时间】:2014-11-16 03:32:05
【问题描述】:
我想从 HTML 中提取一些数据,然后能够在客户端突出显示提取的元素,而无需修改源 html。 XPath 或 CSS Path 看起来很适合这个。 是否可以直接从 BeautifulSoup 中提取 XPATH 或 CSS 路径?
现在我使用目标元素的标记,然后使用 lxml lib 来提取 xpath,这对性能非常不利。我知道BSXPath.py——它不适用于BS4。
由于复杂性,重写所有内容以使用本机 lxml 库的解决方案是不可接受的。
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
【问题讨论】:
-
简短回答:不,没有现有的方法。您必须自己构建它。
标签: python html css xpath beautifulsoup