魔法互联网,
我正在尝试使用"github.com/PuerkitoBio/goquery"从html字符串过滤元素。不幸的是,过滤器函数没有返回预期的结果。我本希望得到一份所有文章的清单,但是……没有。
package main
import (
"fmt"
"os"
"strings"
"github.com/PuerkitoBio/goquery"
)
var html = `
<section>
<article>
<h1>Article 1</h1>
<p>Text for article #1</p>
</article>
<article>
<h1>Article 2</h1>
<p>Text for article #2</p>
</article>
</section>
`
func main() {
qHtml, err := goquery.NewDocumentFromReader(strings.NewReader(html))
if err != nil {
panic(err)
}
articles := qHtml.Filter(`article`)
fmt.Println(articles.Nodes)
goquery.Render(os.Stdout, articles)
}
你正在尝试过滤一个空的选区
从你的问题中我看到你想做的,你可以简单地用Find
代替Filter
。所以在你的例子中应该是:
articles := qHtml.Find("article")
一旦你有一个包含元素的选择,那么你可以使用Filter
。例如,要获取第二篇文章,您可以这样做:
articles := qHtml.Find("article").Filter(":nth-child(2)")
要了解更多关于Filter
的信息,请查看以下资源:
Filter
文档Find
文档PS
:您也可以在单个选择器中组合Find
特定的文章
articles := qHtml.Find("article:nth-child(2)")
按doc
Filter
将匹配的元素集缩减为与选择器字符串匹配的元素集。它为这个匹配元素子集返回一个新的Selection对象。
因为在Filter
之前你没有匹配任何东西,这就是为什么你得到空结果,因为Filter
没有匹配的元素。
您必须首先匹配元素或获得Selection
节点集,然后才能应用Filter
要解决Filter
的问题,可以使用Find
或FindMatcher
searchStr := `article`
articles := qHtml.Find(searchStr)
articles := qHtml.FindMatcher(goquery.Single(searchStr))