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

使用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")
}

关键说明

  1. 父节点选择:确保OnXML的XPath指向一个所有产品页面都存在的父节点,这样回调函数一定会被触发,不会因为无匹配而直接panic。
  2. 子节点判断:使用e.ChildExists(path)可直接检查子节点是否存在;e.ChildText(path)会在节点不存在时返回空字符串,也能用来间接判断。
  3. 规避不稳定路径风险:直接将可能不存在的子节点路径传给OnXML,一旦无匹配就会触发panic;通过父节点内部查找的方式完全规避了这个问题。

内容的提问来源于stack exchange,提问作者Chau Loi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 20:15:41