使用Golang Colly爬取时,如何处理XML路径不存在的问题?
解决Colly爬取时XML路径不存在导致的panic问题
当使用Colly的OnXML方法指定的XPath选择器匹配不到任何节点时,会触发panic: expression must evaluate to a node-set错误——这是因为XPath表达式要求返回节点集,无匹配结果时不符合要求。
要避免程序崩溃并在回调内判断节点是否存在,不要直接将可能不存在的子节点路径作为OnXML的参数,而是先匹配一个所有产品页面都存在的父节点,再在回调函数内部通过Colly提供的方法查找目标子节点。
修改后的完整代码示例
package main import ( "fmt" "log" "github.com/gocolly/colly/v2" ) func main() { c := colly.NewCollector() c.OnError(func(_ *colly.Response, err error) { log.Println("Something went wrong:", err) }) // 先定位到肯定存在的父节点(示例中为h1标签) c.OnXML("/html/body/div[4]/div/div[3]/div[2]/div/div[1]/div[3]/div/div/h1", func(e *colly.XMLElement) { // 检查目标子节点是否存在 if e.ChildExists("./1234") { subTitle := e.ChildText("./1234") fmt.Println("NO ERROR: 副标题内容:", subTitle) } else { fmt.Println("GOT ERROR: 当前产品无副标题") } }) c.OnRequest(func(r *colly.Request) { fmt.Println("Visiting", r.URL) }) c.Visit("https://www.lazada.vn/-i1701980654-s7563711492.html") }
关键说明
- 父节点选择:确保
OnXML的XPath指向一个所有产品页面都存在的父节点,这样回调函数一定会被触发,不会因为无匹配而直接panic。 - 子节点判断:使用
e.ChildExists(path)可直接检查子节点是否存在;e.ChildText(path)会在节点不存在时返回空字符串,也能用来间接判断。 - 规避不稳定路径风险:直接将可能不存在的子节点路径传给
OnXML,一旦无匹配就会触发panic;通过父节点内部查找的方式完全规避了这个问题。
内容的提问来源于stack exchange,提问作者Chau Loi
相关产品推荐
相关产品推荐

