簡體   English   中英

獲取元素的最小XPath

[英]Get minimal XPath of an element

我正在嘗試創建一個返回元素的XPATH的函數。 不幸的是,它返回絕對xpath是不夠的。

我想盡可能地獲得最小的xpath(或者更好 - 更“聰明”,不一定是最小的)。 例如,如果element有id,則返回xpath依賴於其id。

我希望多次使用此xpath,並且根據頁面更改,絕對xpath非常容易受到攻擊。

或者,如果它的父項具有id,則返回父項xpath by id和concat with /child

是否可以使用lxml模塊或其他模塊?

例如, XPath幫助程序向導擴展可以做得更好。

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 /體/格[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] /表/ 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() + "]"
} 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM