goquery- 将标签与后面的标签连接起来
goquery- Concatenate a tag with the one that follows
关于一些背景信息,我是 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"
的内容中。
- 仅对 紧跟
<h1>
标签的 <p>
标签执行此操作。
- 对页面上的 所有 个标签执行此操作。
<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")
^但是此命令将 every single case of <h1..."text"
的内容插入到 every single case of [=19 之前=].
然后,我发现了如何更接近我想要的东西:
doc.Find("p .text").First().Before("h3 .text")
^此命令在 first 之前插入 every single case of <h1..."text"
only 的内容 <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
中的下一个标记——它正在迭代的 *goquery.Selection
。对吗?
或者,正如 mattn
指出的那样,我也可以使用 doc.Find("h1+p")
。
我仍然无法将 <h1..."text"
附加到 <p..."text"
。我会 post 它作为另一个问题,因为你可以将这个问题分解成多个问题,并且 Mattn
已经回答了一个问题。
不知道你在用goquery写什么代码。但也许,您期望的是邻居选择器。
h1+p
这个 returns h1 标签在邻居中有 p 标签。
关于一些背景信息,我是 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"
的内容中。 - 仅对 紧跟
<h1>
标签的<p>
标签执行此操作。 - 对页面上的 所有 个标签执行此操作。
<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")
^但是此命令将 every single case of <h1..."text"
的内容插入到 every single case of [=19 之前=].
然后,我发现了如何更接近我想要的东西:
doc.Find("p .text").First().Before("h3 .text")
^此命令在 first 之前插入 every single case of <h1..."text"
only 的内容 <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
中的下一个标记——它正在迭代的 *goquery.Selection
。对吗?
或者,正如 mattn
指出的那样,我也可以使用 doc.Find("h1+p")
。
我仍然无法将 <h1..."text"
附加到 <p..."text"
。我会 post 它作为另一个问题,因为你可以将这个问题分解成多个问题,并且 Mattn
已经回答了一个问题。
不知道你在用goquery写什么代码。但也许,您期望的是邻居选择器。
h1+p
这个 returns h1 标签在邻居中有 p 标签。