正如我所瞭解的XPath,它是一種瀏覽XML文檔中元素的方法。
方向是XPath - >元素。
你如何去相反?也就是說,從已知的元素值計算XPath?有沒有一種方法可以根據網頁中已知的值計算XPath?
例如,如何找到stackoverflow頭中「faq」鏈接的xpath?
語言並不那麼重要,我對能夠幫助我計算XPath的算法和/或庫/技術更感興趣。
正如我所瞭解的XPath,它是一種瀏覽XML文檔中元素的方法。
方向是XPath - >元素。
你如何去相反?也就是說,從已知的元素值計算XPath?有沒有一種方法可以根據網頁中已知的值計算XPath?
例如,如何找到stackoverflow頭中「faq」鏈接的xpath?
語言並不那麼重要,我對能夠幫助我計算XPath的算法和/或庫/技術更感興趣。
這裏有一個簡單的JS函數來完成它需要什麼。它只使用previousSibling,nodeType和parentNode,所以它應該可以移植到其他語言。然而,結果是不可讀的(對於人類而言),並且在頁面改變時它不會特別可靠。
根據我的經驗,如果手寫,XPath會更有用。但是,您當然可以製作一個算法,以生成更漂亮(如果可能更慢)的結果。
function getXPath(node)
{
if(node == document)
return "/";
var xpath = "";
while (node != null && node.nodeType != Node.DOCUMENT_NODE)
{
print(node.nodeType);
var pos = 1, prev;
while ((prev = node.previousSibling) != null)
{
node = prev
pos++;
}
xpath = "/node()[" + pos + "]" + xpath;
node = node.parentNode;
}
return xpath;
}
因爲XPath可以選擇第n個子元素(即/ parentelement/child_element [2]),所以如果你可以找出樹中元素的位置,那麼你應該能夠生成一個XPath回來。
您沒有指定使該問題難以回答的語言。蟒蛇LXML模塊可以做到這一點
>>> a = etree.Element("a")
>>> b = etree.SubElement(a, "b")
>>> c = etree.SubElement(a, "c")
>>> d1 = etree.SubElement(c, "d")
>>> d2 = etree.SubElement(c, "d")
>>> tree = etree.ElementTree(c)
>>> print(tree.getpath(d2))
/c/d[2]
>>> tree.xpath(tree.getpath(d2)) == [d2]
True
即使你不使用python你會發現你在模塊的源代碼