2

对于一些背景信息,我是 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. 仅对紧跟标签的<p>标签执行此操作。<h1>
  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")

^但此命令会<h1..."text".<p..."text"

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

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

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

我也尝试使用goquery'Each()函数,但我无法通过该方法更接近我想要的(尽管我确信有一种方法可以做到这一点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--the*goquery.Selection中的下一个标签。那是对的吗?

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

我仍然无法附加<h1..."text"<p..."text". 我会将其作为另一个问题发布,因为您可以将其分解为多个问题,并且Mattn已经回答了一个问题。

4

1 回答 1

1

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

h1+p

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

于 2015-01-06T05:27:39.667 回答