python - 获取元素的最小 XPath

标签 python html python-2.7 xpath web-scraping

我正在尝试创建一个返回元素的 XPATH 的函数。不幸的是,它返回的绝对 xpath 是不够的。

我想获得尽可能小的 xpath(或者更好 - 更“聪明”,不一定是最小的)。例如,如果元素有 id,则根据其 id 返回 xpath。

我想多次使用这个 xpath,根据页面变化,绝对 xpath 非常脆弱。

或者如果它的父级有 id,则通过 id 返回父级 xpath 并与 /child 连接。

lxml 模块或其他模块是否可行?

例如 XPath helper wizard 扩展可以做得更好。

def _load_root(url):
    r = requests.get(url)
    r.encoding = 'utf-8'
    html = r.content
    return etree.fromstring(html, etree.HTMLParser())

def get_xpath_by_text(text,url):
    root = _load_root(url)
    e = root.xpath('.//*[contains(text(),"{}")]'.format(text))
    print root.getpath(e)

/html/body/div[1]/div[1]/div[1]/div[2]/div[1]/div[1]/div[2]/div[2]/div[1]/div/div[1]/div[2]/div[2]/div[2]/div[1]/div[1]/table/tr[6]/td[2]/div[1]

你知道怎么做吗?

最佳答案

据我所知,您要求的是两个相互矛盾的东西:最小的 XPath 和对文档更改稳定的 XPath。

元素的最小 XPath 通常类似于 (//*)[134],但这对文档更改非常敏感。

您可以使用如下递归算法获取相对于具有 id() 属性的最近祖先的 XPath:

function minimalXpath(Node node) {
  if (exists(node/@id))
    then "id(" + node/@id + ")"
  else if (node is root)
    then ""
  else minimalXPath(node.getParent()) + "/" + node.getName() +
    "[" + node.getSiblingPosition() + "]"
} 

关于python - 获取元素的最小 XPath,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41386519/

相关文章:

html - 如何让导航栏(可能还有其他东西)在右边结束

python - Pi 上的 Pygame 通过 Putty 运行,无屏幕,无输入

python - 时间序列数据的异常值检测

javascript - 如何改变一个 div 的高度以适应其中包含的其他 div?

JavaScript 按钮值和进度条

python - 打印 Python 函数参数的名称和值

python - python 上的简单正则表达式

python - 判断 python 是否处于 -i 模式

python - 尽可能短的路线,从任何地方开始和结束

python - PyQt 将graphicsScene 对象分组为一个对象