我试图对html文档执行xpath操作。我想做一个两级的xpath查询。html文档"index.html“如下:
<!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>我想首先获得带有class="area“的所有div,然后使用Gokogiri递归地获取在golang中带有class="value”的div。
我的go代码如下: package
import (
"fmt"
"io/ioutil"
"github.com/moovweb/gokogiri"
"github.com/moovweb/gokogiri/xpath"
)
func main() {
content, _ := ioutil.ReadFile("index.html")
doc, _ := gokogiri.ParseHtml(content)
defer doc.Free()
xps := xpath.Compile("//div[@class='head']/div[@class='area']")
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
10
20
30
10
20
30我打算得到:
10
20
30我想递归地搜索xpath模式。我认为我的第二级xpath模式有问题。看起来,我的第二级xpath再次在整个文档中搜索,而不是使用class="area“的单个div。对于递归xpath模式搜索,我应该做什么?我很感谢你的帮助。
发布于 2014-08-19 15:44:54
来自任何节点的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发布于 2014-08-19 15:45:32
您的第二个查询//div[@class='value']将选择文档中任何位置的divs,而不考虑父元素。相反,请尝试div[@class='value']。
https://stackoverflow.com/questions/25386761
复制相似问题