【问题标题】:goquery- Concatenate a tag with the one that followsgoquery - 将标签与后面的标签连接起来
【发布时间】:2015-01-05 23:04:41
【问题描述】:

对于一些背景信息,我是 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. 提取&lt;h1..."text"的内容。
  2. 插入(并连接)这个提取的内容到&lt;p..."text"的内容中。
  3. 仅对紧跟&lt;h1&gt; 标记的&lt;p&gt; 标记执行此操作。
  4. 对页面上的所有&lt;h1&gt;标签执行此操作。

所以这就是我想要的样子:

<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)

我知道我可以通过以下方式阅读&lt;h1..."text"

h3_tag := doc.Find("h3 .text")

我也知道可以将&lt;h1..."text"的内容添加到&lt;p..."text"的内容中:

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

^但是这个命令会在&lt;h1..."text"每一个案例之前插入每一个案例&lt;p..."text"之前的内容。

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

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

^此命令在&lt;p..."text"第一个 案例之前插入每个 案例&lt;h1..."text" only 的内容(即更接近我想要的)。

我也尝试使用goqueryEach() 函数,但我无法通过该方法更接近我想要的(尽管我确信有一种方法可以使用Each(),对吧? )

我最大的问题是我不知道如何将&lt;h1..."text" 的每个实例与紧随其后的&lt;p..."text" 实例相关联。

如果有帮助,&lt;h1..."text" 在我尝试解析的网页上总是后跟 &lt;p..."text"

我的脑子没电了。有没有围棋天才知道如何做到这一点并愿意解释它?提前致谢。

编辑

我发现了其他我可以做的事情:

doc.Find("h1").Each(func(i int, s *goquery.Selection) {
    nex := s.Next().Text()
    fmt.Println(s.Text(), nex, "\n\n")
})

^这会打印出我想要的内容——&lt;h1..."text" 的每个实例的内容,然后是&lt;p..."text" 的直接实例。我原以为s.Next() 会输出&lt;h1&gt; 的下一个实例,但它会输出doc 中的下一个标签——它正在迭代的*goquery.Selection。对吗?

或者,正如mattn 指出的那样,我也可以使用doc.Find("h1+p")

我仍然无法将&lt;h1..."text" 附加到&lt;p..."text"。我会将它作为另一个问题发布,因为您可以将这个问题分解为多个问题,Mattn 已经回答了一个问题。

【问题讨论】:

    标签: go goquery


    【解决方案1】:

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

    h1+p
    

    这将返回在邻居中有 p 标签的 h1 标签。

    【讨论】:

    • 哇!那很简单。这段代码有点长——有没有办法让它更短?哈哈。谢谢!我只是想出了另一种方法,我也会发布。
    • 好吧,也许我没有找到其他方法。我几乎做到了。我会更新我的问题来解释它。
    • 这很讽刺。这个问题是一些代码将数据放入sqlite数据库,你是sqlite3驱动的作者! git repo 上很棒的例子。 :)
    猜你喜欢
    • 1970-01-01
    • 2011-07-26
    • 2015-04-12
    • 1970-01-01
    • 2022-10-31
    • 1970-01-01
    • 2021-09-14
    • 1970-01-01
    • 2022-11-28
    相关资源
    最近更新 更多