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

使用Excel VBA抓取网页数据:无法获取标题及厂商料号求助

问题分析
  1. 变量声明不规范:str、FullURL未声明,Dim strData, StrData1 As String仅将StrData1声明为String类型,strData默认是Variant类型,易引发类型错误。
  2. 页面等待逻辑不完善:仅判断objWeb.Busy无法确保页面完全加载,需同时校验ReadyState是否为4(页面加载完成状态)。
  3. XPath调用错误:IE的Document对象不支持直接调用XPath方法,必须通过SelectSingleNode/SelectNodes执行查询,错误的调用方式会触发"Object required"报错。
  4. 字符串变量误用Set:Set strData = Nothing属于错误写法,字符串变量无需用Set赋值。
修改后的代码
Sub Mani()
    'Declare variables
    Dim objWeb As Object
    Dim objHTML As Object
    Dim strBaseURL As String
    Dim strPartNumber As String
    Dim FullURL As String
    Dim strProductTitle As String
    Dim strManufacturerPartNumber As String
    Dim strProductOverview As String
    Dim strProductDetails As String
    
    '初始化IE对象
    Set objWeb = CreateObject("internetexplorer.Application")
    objWeb.Visible = False '调试时可改为True查看页面状态
    
    strBaseURL = "https://cpc.farnell.com/"
    strPartNumber = Trim(Cells(1, 1).Value)
    If strPartNumber = "" Then
        MsgBox "请在A1单元格输入料号"
        objWeb.Quit
        Set objWeb = Nothing
        Exit Sub
    End If
    
    '跳转初始URL
    objWeb.navigate strBaseURL & strPartNumber
    
    '等待页面加载完成
    Do While objWeb.Busy Or objWeb.ReadyState <> 4
        DoEvents
    Loop
    
    FullURL = objWeb.LocationURL
    Range("B2").Value = FullURL
    
    '重新加载完整URL(绕过重定向)
    objWeb.navigate FullURL
    
    '再次等待加载完成
    Do While objWeb.Busy Or objWeb.ReadyState <> 4
        DoEvents
    Loop
    
    Set objHTML = objWeb.document
    
    '获取产品概述
    On Error Resume Next '防止元素不存在导致代码中断
    strProductOverview = objHTML.getElementById("pdpSection_FAndB").innerText
    On Error GoTo 0
    ActiveSheet.Range("C3").Value = strProductOverview
    
    '获取产品信息
    On Error Resume Next
    strProductDetails = objHTML.getElementById("pdpSection_pdpProdDetails").innerText
    On Error GoTo 0
    ActiveSheet.Range("D3").Value = strProductDetails
    
    '获取产品标题(XPath方式)
    On Error Resume Next
    strProductTitle = objHTML.SelectSingleNode("//h1[@class='productTitle']").innerText
    '若XPath失效,可改用Class获取:objHTML.getElementsByClassName("productTitle")(0).innerText
    On Error GoTo 0
    ActiveSheet.Range("E3").Value = strProductTitle
    
    '获取厂商料号(优先用ID定位,更高效)
    On Error Resume Next
    strManufacturerPartNumber = objHTML.getElementById("manufacturerPartNumber").innerText
    '备选XPath写法:objHTML.SelectSingleNode("//span[@id='manufacturerPartNumber']").innerText
    On Error GoTo 0
    ActiveSheet.Range("F3").Value = strManufacturerPartNumber
    
    '清理资源
    objWeb.Quit
    Set objWeb = Nothing
    Set objHTML = Nothing
End Sub
关键说明
  • 变量规范:明确声明所有变量类型,避免Variant类型带来的潜在问题。
  • 页面等待:使用Do While objWeb.Busy Or objWeb.ReadyState <> 4确保页面完全加载,DoEvents让Excel在等待时响应其他操作。
  • 元素定位:
    • 产品标题优先用XPath//h1[@class='productTitle'],若页面结构变动,可改用getElementsByClassName方法(注意索引从0开始)。
    • 厂商料号直接用getElementById定位更可靠,比XPath执行效率更高。
  • 错误处理:加入On Error Resume Next防止因元素不存在导致代码中断,之后恢复默认错误处理逻辑On Error GoTo 0。
  • 资源清理:显式释放IE和DOM对象,避免内存泄漏。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 11:35:41