goquery- 将标签与后面的标签连接起来

goquery- Concatenate a tag with the one that follows

关于一些背景信息,我是 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>

我愿意:

  1. 提取<h1..."text"的内容。
  2. 将提取的内容插入(并连接)到 <p..."text" 的内容中。
  3. 仅对 紧跟 <h1> 标签的 <p> 标签执行此操作。
  4. 对页面上的 所有 个标签执行此操作。<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")

^但是此命令将 every single case of <h1..."text" 的内容插入到 every single case of [=19 之前=].

然后,我发现了如何更接近我想要的东西:

doc.Find("p .text").First().Before("h3 .text")

^此命令在 first 之前插入 every single case of <h1..."text" only 的内容 <p..."text" 的情况(这更接近我想要的)。

我也尝试过使用 goqueryEach() 函数,但我无法用该方法更接近我想要的东西(尽管我确信有一种方法可以做到这一点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"。我会 post 它作为另一个问题,因为你可以将这个问题分解成多个问题,并且 Mattn 已经回答了一个问题。

不知道你在用goquery写什么代码。但也许,您期望的是邻居选择器。

h1+p

这个 returns h1 标签在邻居中有 p 标签。