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



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

^但是此命令在每个<p..."text"案例之前插入每个<h1..."text"案例中的内容。

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

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

^此命令仅在<p..."text"的第一个案例之前插入每个<h1..."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, "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 标签。

相关内容

  • 没有找到相关文章

最新更新