Xml Golang Gokogiri递归xpath异常
我试图对html文档执行xpath操作。我想做一个两级xpath查询。html文档“index.html”如下所示:Xml Golang Gokogiri递归xpath异常,xml,xpath,recursion,go,Xml,Xpath,Recursion,Go,我试图对html文档执行xpath操作。我想做一个两级xpath查询。html文档“index.html”如下所示: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <div class="head">
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<div class="head">
<div class="area">
<div class="value">10</div>
</div>
<div class="area">
<div class="value">20</div>
</div>
<div class="area">
<div class="value">30</div>
</div>
</div>
</body>
</html>
但是,我得到的输出是奇数:
10
20
30
10
20
30
10
20
30
我打算:
10
20
30
我想递归地搜索xpath模式。我认为我的第二级xpath模式有问题。看起来,我的第二级xpath再次是在整个文档中搜索,而不是使用class=“area”搜索单个div。对于递归xpath模式搜索,我该怎么做?非常感谢您的帮助。来自任何节点的XPath搜索仍然可以搜索整个树 如果只想搜索子树,可以使用
(假设您仍然需要后代或自身)启动表达式,否则使用精确路径
xps := xpath.Compile("//div[@class='head']/div[@class='area']")
xpw := xpath.Compile(".//div[@class='value']")
// this works in your example case
// xpw := xpath.Compile("div[@class='value']")
// as does this
// xpw := xpath.Compile("./div[@class='value']")
ss, _ := doc.Root().Search(xps)
for _, s := range ss {
ww, _ := s.Search(xpw)
for _, w := range ww {
fmt.Println(w.InnerHtml())
}
}
印刷品:
10
20
30
您的第二个查询
//div[@class='value']
,将选择文档中任意位置的div,而不管父元素是什么。相反,请尝试div[@class='value']
您好,谢谢!这确实解决了问题。顺便说一句,第二个xpath//div[@class='value']
,它不是在当前上下文中搜索的吗?如果div.value
位于div.area
下的DOM深处,而我想搜索div.value
,该怎么办?刚才看到了您的问题。供将来参考。。。是的,它是从当前上下文(上下文节点)开始的。但是由于XPath表达式以/
开头,所以上下文节点没有区别,除了确定/
与哪个文档相关。如果希望XPath表达式仅选择作为上下文节点后代的div
元素,请使用//div[…]
(注意前面的点)。是的,这解决了我的问题。“点”有什么用?那个“点”,它表示当前节点吗?但是在for循环中,如果s
在上下文中,那么//div[@class='value']
也有意义,对吗?我之所以这么说,是因为如果每次迭代中的根元素是div.area
,那么//div[@class='value']
就有意义了。@ArunL://
是/genderant或self::node()//
的缩写,因此它本身的第一个斜线表示树根。
是self::node()
的别名。(我确信有一个比维基百科更好的参考资料)也注意到与任何文件系统的相似性,其中
代表当前目录
10
20
30