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

时间:2015-01-05 23:04:41

标签: go 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. 仅针对{em>紧跟 <p>标记的<h1>标记执行此操作。
  4. 为页面上<h1>标记的所有执行此操作。
  5. 所以这就是我想要的样子:

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

    ^但是此命令在{em>每个 <h1..."text"的情况之前插入来自 {/ 1}}的每个个案的内容。

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

    <p..."text"

    ^此命令在doc.Find("p .text").First().Before("h3 .text") {strong}的第一个案例之前插入来自 {/ 1}}仅的每个案例的内容(这更接近我想要的)。

    我也尝试使用<h1..."text"的{​​{1}}功能,但我无法接近我想要的方法(虽然我确定在那里&#39;用<p..."text"来做到这一点,对吗?)

    我最大的问题是,我无法弄清楚如何将goquery的每个实例与紧随其后的Each()实例相关联。

    如果有帮助,Each() 始终,然后在我尝试解析的网页上显示<h1..."text"

    我的大脑没有果汁。 Go天才知道如何做到这一点并愿意解释吗?提前谢谢。

    修改

    我发现了我能做的其他事情:

    <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")已经回答了一个问题。

1 个答案:

答案 0 :(得分:1)

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

h1+p

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