You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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列表索引规则完全一致):

  1. 找到id为mw-content-text的div,取它的第一个直接子div
  2. 在该div下找到所有tbody元素,取第2个(索引1)
  3. 在该tbody下找到所有tr元素,取第3个(索引2)
  4. 在该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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 08:33:11