对于某些背景信息,我是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"
的内容中。 <p>
标记的<h1>
标记执行此操作。 <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")
^但是此命令在{em>每个 <h1..."text"
的情况之前插入来自 {/ 1}}的每个个案的内容。
然后,我发现如何更接近我想要的一步:
<p..."text"
^此命令在doc.Find("p .text").First().Before("h3 .text")
{strong}的第一个案例之前插入来自 {/ 1}}仅的每个案例的内容(这更接近我想要的)。
我也尝试使用<h1..."text"
的{{1}}功能,但我无法接近我想要的方法(虽然我确定在那里&#39;用<p..."text"
来做到这一点,对吗?)
我最大的问题是,我无法弄清楚如何将goquery
的每个实例与紧随其后的Each()
实例相关联。
如果有帮助,Each()
始终,然后在我尝试解析的网页上显示<h1..."text"
。
我的大脑没有果汁。 Go天才知道如何做到这一点并愿意解释吗?提前谢谢。
我发现了我能做的其他事情:
<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")
已经回答了一个问题。
答案 0 :(得分:1)
我不知道你在用goquery编写代码。但也许,你期望的是邻居选择器。
h1+p
返回邻居中有p标签的h1标签。