【发布时间】:2015-01-05 23:04:41
【问题描述】:
对于一些背景信息,我是 Go 新手(3 或 4 天),但我开始对它更熟悉了。
我正在尝试使用goquery 来解析网页。 (最终我想将一些数据放入数据库中)。对于我的问题,一个例子将是解释它的最简单方法:
<html>
<body>
<h1>
<span class="text">Go </span>
</h1>
<p>
<span class="text">totally </span>
<span class="post">kicks </span>
</p>
<p>
<span class="text">hacks </span>
<span class="post">its </span>
</p>
<h1>
<span class="text">debugger </span>
</h1>
<p>
<span class="text">should </span>
<span class="post">be </span>
</p>
<p>
<span class="text">called </span>
<span class="post">ogle </span>
</p>
<h3>
<span class="statement">true</span>
</h3>
</body>
<html>
我想:
-
提取
<h1..."text"的内容。 -
插入(并连接)这个提取的内容到
<p..."text"的内容中。 - 仅对紧跟
<h1>标记的<p>标记执行此操作。 - 对页面上的所有个
<h1>标签执行此操作。
所以这就是我想要的样子:
<html>
<body>
<p>
<span class="text">Go totally </span>
<span class="post">kicks </span>
</p>
<p>
<span class="text">hacks </span>
<span class="post">its </span>
</p>
<p>
<span class="text">debugger should </span>
<span class="post">be </span>
</p>
<p>
<span class="text">called </span>
<span class="post">ogle</span>
</p>
<h3>
<span class="statement">true</span>
</h3>
</body>
<html>
代码是这样开始的,
package main
import (
"fmt"
"strings"
"github.com/PuerkitoBio/goquery"
)
func main() {
html_code := strings.NewReader(`code_example_above`)
doc, _ := goquery.NewDocumentFromReader(html_code)
我知道我可以通过以下方式阅读<h1..."text":
h3_tag := doc.Find("h3 .text")
我也知道可以将<h1..."text"的内容添加到<p..."text"的内容中:
doc.Find("p .text").Before("h3 .text")
^但是这个命令会在<h1..."text"的每一个案例之前插入每一个案例<p..."text"之前的内容。
然后,我发现了如何更接近我想要的:
doc.Find("p .text").First().Before("h3 .text")
^此命令在<p..."text" 的第一个 案例之前插入每个 案例<h1..."text" only 的内容(即更接近我想要的)。
我也尝试使用goquery 的Each() 函数,但我无法通过该方法更接近我想要的(尽管我确信有一种方法可以使用Each(),对吧? )
我最大的问题是我不知道如何将<h1..."text" 的每个实例与紧随其后的<p..."text" 实例相关联。
如果有帮助,<h1..."text" 在我尝试解析的网页上总是后跟 <p..."text"。
我的脑子没电了。有没有围棋天才知道如何做到这一点并愿意解释它?提前致谢。
编辑
我发现了其他我可以做的事情:
doc.Find("h1").Each(func(i int, s *goquery.Selection) {
nex := s.Next().Text()
fmt.Println(s.Text(), nex, "\n\n")
})
^这会打印出我想要的内容——<h1..."text" 的每个实例的内容,然后是<p..."text" 的直接实例。我原以为s.Next() 会输出<h1> 的下一个实例,但它会输出doc 中的下一个标签——它正在迭代的*goquery.Selection。对吗?
或者,正如mattn 指出的那样,我也可以使用doc.Find("h1+p")。
我仍然无法将<h1..."text" 附加到<p..."text"。我会将它作为另一个问题发布,因为您可以将这个问题分解为多个问题,Mattn 已经回答了一个问题。
【问题讨论】: