gpt4 book ai didi

python - BeautifulSoup 提取节点的 XPATH 或 CSS 路径

转载 作者:太空狗 更新时间:2023-10-29 13:29:12 27 4
gpt4 key购买 nike

我想从 HTML 中提取一些数据,然后能够在客户端突出显示提取的元素,而无需修改源 html。 XPath 或 CSS Path 看起来很适合这个。 是否可以直接从 BeautifulSoup 中提取 XPATH 或 CSS 路径?
现在我使用目标元素的标记,然后使用 lxml 库来提取 xpath,这对性能非常不利。我知道 BSXPath.py——它不适用于 BS4。由于复杂性,重写所有内容以使用原生 lxml 库的解决方案是 Not Acceptable 。

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

最佳答案

提取简单的 CSS/XPath 实际上非常容易。这与 lxml 库为您提供的相同。

def get_element(node):
# for XPATH we have to count only for nodes with same type!
length = len(list(node.previous_siblings)) + 1
if (length) > 1:
return '%s:nth-child(%s)' % (node.name, length)
else:
return node.name

def get_css_path(node):
path = [get_element(node)]
for parent in node.parents:
if parent.name == 'body':
break
path.insert(0, get_element(parent))
return ' > '.join(path)

soup = bs4.BeautifulSoup('<div></div><div><strong><i>bla</i></strong></div>')
assert get_css_path(soup.i) == 'div:nth-child(2) > strong > i'

关于python - BeautifulSoup 提取节点的 XPATH 或 CSS 路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25969474/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com