如何使用Golang解析页面链接并提取链接内所需数据
解决方案
你现在的代码只是把整个.dbaListing元素的文本存进了切片,没有精准提取链接、标题、价格这些目标字段。下面是修改后的完整代码,直接实现你要的功能:
package main import ( "fmt" "strings" "github.com/gocolly/colly" ) // 字段首字母大写符合Go导出规则,方便后续扩展(比如序列化输出) type Pars struct { Link string Title string Price string } func main() { scrapURL := "https://www.dba.dk/mobil-og-telefoni/mobiltelefoner-og-tilbehoer/iphone/model-12/" c := colly.NewCollector( colly.AllowedDomains("www.dba.dk"), ) // 存储所有提取到的商品数据 var items []Pars // 遍历每个商品列表项 c.OnHTML(".dbaListing", func(h *colly.HTMLElement) { item := Pars{} // 提取商品链接:取列表项内h3下a标签的href属性 item.Link = h.ChildAttr("h3 a", "href") // 补全相对链接为完整域名地址 if !strings.HasPrefix(item.Link, "http") { item.Link = "https://www.dba.dk" + item.Link } // 提取商品标题:取a标签的文本并去除空白 item.Title = strings.TrimSpace(h.ChildText("h3 a")) // 提取商品价格:取.price元素的文本并去除空白 item.Price = strings.TrimSpace(h.ChildText(".price")) items = append(items, item) }) // 发起页面访问,处理可能的错误 err := c.Visit(scrapURL) if err != nil { fmt.Println("访问页面失败:", err) return } // 打印所有提取结果 for i, item := range items { fmt.Printf("第%d个商品:\n", i+1) fmt.Printf("链接:%s\n", item.Link) fmt.Printf("标题:%s\n", item.Title) fmt.Printf("价格:%s\n\n", item.Price) } }
关键说明:
- 精准元素定位:
- 用
ChildAttr获取子元素的属性值(比如a标签的href) - 用
ChildText获取子元素的文本内容(标题、价格) - 用
strings.TrimSpace清理文本前后的空白,让数据更整洁
- 用
- 链接补全:页面返回的href可能是相对路径,手动拼接域名后才能直接访问
- 批量数据收集:把每个商品的信息存入切片,而非仅提取第一个元素
如果需要从商品详情页提取更多数据(比如商品描述、成色),可以添加详情页回调:
// 访问商品详情页时触发的处理逻辑 c.OnHTML(".adPage", func(h *colly.HTMLElement) { desc := strings.TrimSpace(h.ChildText(".description")) fmt.Printf("商品描述:%s\n", desc) })
然后在列表项的回调里,调用h.Request.Visit(item.Link)即可自动触发详情页的爬取。
内容的提问来源于stack exchange,提问作者Kildaaa
相关产品推荐
相关产品推荐

