有关某些背景信息,我是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")
^但这命令插入从内容的每一个的情况下,<h1..."text"
之前的每一个的情况下<p..."text"
。
然后,我发现了如何更接近我想要的:
doc.Find("p .text").First().Before("h3 .text")
^此命令仅在第一种情况(更接近我想要的)之前插入每个情况下的内容。<h1..."text"
<p..."text"
我也尝试过使用goquery
'sEach()
函数,但无法更接近该方法想要的功能(尽管我敢肯定有一种方法可以使用它Each()
,对吗?)
我最大的问题是我不知道如何将的每个实例<h1..."text"
与<p..."text"
紧随其后的实例相关联。
如果有帮助,<h1..."text"
则总是<p..."text"
在我尝试解析的网页上跟随。
我的大脑没水了。有任何Go天才知道如何做并且愿意解释吗?提前致谢。
我发现了我可以做的其他事情:
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
--the *goquery.Selection
,它的迭代通过。那是对的吗?
或者,mattn
如前所述,我也可以使用doc.Find("h1+p")
。
我仍然无法附加<h1..."text"
到<p..."text"
。我将其发布为另一个问题,因为您可以将其分解为多个问题,并且Mattn
已经回答了一个问题。
我不知道您在用goquery编写代码。但是也许,您期望的是邻居选择器。
h1+p
这将返回在邻居中具有p标签的h1标签。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句