如何在goquery中实现类似BeautifulSoup find_all的元素查找功能
问题原因
你的goquery选择器逻辑完全错误,根本没有匹配到目标节点,核心问题有两个:
- 选择范围不对:
#mw-content-text div会匹配id为mw-content-text的节点下所有嵌套层级的div,不是你要的第一个直接子div,后续靠连续Eq()凑索引的写法完全脱离了原Python代码的选择路径 Eq()用法和索引值错误:Eq()是从当前匹配集合中取指定索引的单个元素,你写的.Find("tbody").Eq(2).Eq(1),第一次Eq(2)后集合里只剩1个元素,再取索引1直接返回空;同时Python代码里取的是第2个tbody(索引1),你写的Eq(2)是取第3个,本身就找错了节点。
实现逻辑对齐
逐行匹配Python代码的选择规则即可(所有索引从0开始计数,和Python列表索引规则完全一致):
- 找到id为
mw-content-text的div,取它的第一个直接子div - 在该div下找到所有
tbody元素,取第2个(索引1) - 在该tbody下找到所有
tr元素,取第3个(索引2) - 在该tr下找到所有
td元素,取第2个(索引1),提取文本内容
修正后的可运行代码
package main import ( "fmt" "log" "net/http" "github.com/PuerkitoBio/goquery" ) func getSnatch49() string { res, e := http.Get("https://en.wikipedia.org/wiki/List_of_Olympic_records_in_weightlifting") if e != nil { log.Fatal(e) } defer res.Body.Close() if res.StatusCode != 200 { log.Fatalf("failed to fetch data: %d %s", res.StatusCode, res.Status) } doc, err := goquery.NewDocumentFromReader(res.Body) if err != nil { log.Fatal(err) } // 严格对齐Python代码的选择路径 record := doc.Find("#mw-content-text > div").Eq(0). Find("tbody").Eq(1). Find("tr").Eq(2). Find("td").Eq(1). Text() return record } func main() { fmt.Println(getSnatch49()) // 输出结果: 94 kg }
提示:查找直接子元素时要显式使用
>选择器,不要省略,否则会把所有嵌套的后代元素都加入匹配集合,很容易出现索引错位问题。
内容的提问来源于stack exchange,提问作者John Smith
相关产品推荐
相关产品推荐

