Colly实战问题:如何获取子元素的文本内容?
解决Colly爬取Lazada商品标题的问题
问题原因
你用ChildAttrs传入"text"无法获取内容,是因为ChildAttrs的设计目的是获取HTML元素的属性值(比如class、id这类属性),而元素的文本内容并不是HTML属性,所以这个方法完全不适用于获取文本。
正确解决方案
1. 直接获取目标元素的文本
针对你要爬取的h1.pdp-mod-product-badge-title元素,直接使用Colly提供的Text()方法就能拿到文本内容,代码示例:
package main import ( "fmt" "github.com/gocolly/colly/v2" ) func main() { // 初始化Collector c := colly.NewCollector( colly.UserAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"), ) // 监听目标元素 c.OnHTML("h1.pdp-mod-product-badge-title", func(e *colly.HTMLElement) { // 获取当前元素的文本内容 title := e.Text fmt.Println("商品标题:", title) }) // 发起请求 err := c.Visit("https://www.lazada.vn/-i1701980654-s7563711492.html") if err != nil { fmt.Printf("请求失败:%v\n", err) } }
2. 处理动态渲染的情况
如果上面的代码还是拿不到内容,大概率是Lazada用JavaScript动态渲染了页面内容。这时候需要启用Colly的Headless模式来加载JS,代码调整如下:
package main import ( "fmt" "github.com/gocolly/colly/v2" "github.com/gocolly/colly/v2/extensions" ) func main() { // 初始化支持Headless的Collector c := colly.NewCollector( colly.Headless(true), colly.UserAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"), ) // 启用扩展,处理JS渲染后的页面 extensions.RandomUserAgent(c) // 监听目标元素 c.OnHTML("h1.pdp-mod-product-badge-title", func(e *colly.HTMLElement) { fmt.Println("商品标题:", e.Text) }) // 发起请求 err := c.Visit("https://www.lazada.vn/-i1701980654-s7563711492.html") if err != nil { fmt.Printf("请求失败:%v\n", err) } }
关键知识点
ChildAttrs(selector, attr string):仅用于获取指定选择器下元素的某个属性值,比如ChildAttrs("a", "href")拿链接地址Text():获取当前HTMLElement的文本内容ChildText(selector string):获取指定子选择器下的文本内容(如果目标文本在当前元素的子节点里时使用)
内容的提问来源于stack exchange,提问作者Chau Loi
相关产品推荐
相关产品推荐

