有关一些背景信息,我是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>
我想:
  • 提取<h1..."text"的内容。
  • 插入(并连接)此提取的内容到<p..."text"的内容中。
  • 仅对紧跟<p>标记的<h1>标记执行此操作。
  • 对页面上<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"的每个个案中的内容,仅在之前插入内容(这与我想要的更接近)。
    我也尝试过使用goqueryEach()函数,但是我无法更接近该方法想要的功能(尽管我确定可以使用Each()做到这一点,对吗?)
    我最大的问题是我不知道如何将<h1..."text"的每个实例与紧随其后的<p..."text"实例相关联。
    如果有帮助,则在我要解析的网页上,<h1..."text"始终为
    ,然后为<p..."text",始终为
    我的大脑没水了。有任何Go天才知道如何做并且愿意解释吗?提前致谢。
    编辑
    我发现了我可以做的其他事情:
    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"。我将其发布为另一个问题,因为您可以将其分解为多个问题,并且Mattn已经回答了一个问题。

    最佳答案

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

    h1+p
    

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

    关于go - goquery-将标签与后面的标签连接,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27789446/

    10-14 23:48
    查看更多