通过nokogiri并选择带有xpath的元素相当容易。我需要反之亦然,这意味着:我需要例如在nokogiri节点上调用.to_xpath
以获取元素的完整xpath以将其存储在记录中。
任何人都知道这样做的方法吗?
答案 0 :(得分:11)
我能想到的最简单的方法是:
Nokogiri::CSS.xpath_for node.css_path
编辑:您也可以尝试path
方法。
答案 1 :(得分:1)
我能想到的最简单的事情就是使用parent
构建一个返回根节点的元素路径(即返回<html>
)和每个节点的previous_element
来弄清楚该节点在其兄弟姐妹中的数字索引。由于只有一个<body>
和<html>
(Nokogiri会在必要时为您添加这些内容),一旦您点击<body>
节点,您就可以停止向父母走来。
算法如下所示:
path = [ ]
,n
是您已有的节点。s = n
并致电s = s.previous_element
直到s.nil?
并计算您进行了多少次迭代,这将为您提供n
在其兄弟姐妹中的位置。将该职位置于index
。请记住,XPath位置是一个基础。path.unshift('*[' + index.to_s + ']')
。p = n.parent
,如果p
不是<body>
,那么n = p
并返回第2步。path.unshift('body').unshift('html')
。xpath = '/' + path.join('/')
所以给出了像这样的HTML:
<ul><li>a</li><li><b>b<em>c</em></b></li></ul>
和<em>c</em>
的起始节点,你最终会得到一个像这样的XPath:
/html/body/*[1]/*[2]/*[1]/*[1]
不完全漂亮,但至少过程相当简单,结果XPath将是唯一的。
如果您需要DOM中大多数节点的路径,那么您可以从根目录开始,并在路上向所有节点编号。这样你就可以避免一遍又一遍地走兄弟姐妹。