对于一些背景信息,我是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")
^但是此命令在每个<p..."text"
案例之前插入每个<h1..."text"
案例中的内容。
然后,我发现了如何更接近我想要的一步:
doc.Find("p .text").First().Before("h3 .text")
^此命令仅在<p..."text"
的第一个案例之前插入每个<h1..."text"
案例中的内容(这更接近我想要的)。
我也尝试使用 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, "nn")
})
^这会打印出我想要的内容 - 每个<h1..."text"
实例的内容,然后是它的直接实例<p..."text"
。我原以为s.Next()
会输出<h1>
的下一个实例,但它输出了doc
的下一个标签——它正在迭代的*goquery.Selection
。这是对的吗?
或者,正如mattn
指出的那样,我也可以使用doc.Find("h1+p")
.
我仍然无法将<h1..."text"
附加到<p..."text"
。我将它作为另一个问题发布,因为您可以将这个问题分解为多个问题,Mattn
已经回答了一个问题。
你在用goquery写什么代码。但也许,您的期望是邻居选择器。
h1+p
这将返回在邻居中具有 p 标签的 h1 标签。