使用VBA+Selenium提取指定网页内容遇阻,请求技术帮助
问题:从WebSRO页面提取Correios物流信息的VBA实现问题
目标提取信息
- 状态:
Objeto recebido pelos Correios do Brasil - 日期:
Data: 17/03/2023 às 07:57 - 地点:
Local: CURITIBA / PR
尝试过的代码及问题
无效代码尝试
Cells(linha, 12).value = navegadorChrome.FindElementsByClass("container")(1).FindElementsByCss("row")(4).Text Cells(linha, 13).value = navegadorChrome.FindElementsByClass("container")(1).FindElementsByclassName("bold eventoLocal")(1).Text
接近目标但存在局限的代码
仅能获取<span>标签内的文本,无法提取标签之后的目标内容:
Cells(linha, 13).value = navegadorChrome.FindElementsByClass("container")(1).FindElementByXPath("/html/body/div[1]/div[4]/div[1]/div[1]/table[1]/tbody[1]/tr[1]/td[1]/span[1]/").Text
解决方案
方法1:XPath直接定位span后的文本节点
利用XPath的following-sibling::text()语法,直接获取span标签之后的文本内容:
' 提取状态 Cells(linha, 12).Value = navegadorChrome.FindElementByXPath("/html/body/div[1]/div[4]/div[1]/div[1]/table[1]/tbody[1]/tr[1]/td[1]/span[1]/following-sibling::text()[1]").Text ' 提取日期 Cells(linha, 13).Value = navegadorChrome.FindElementByXPath("/html/body/div[1]/div[4]/div[1]/div[1]/table[1]/tbody[1]/tr[1]/td[2]").Text ' 提取地点 Cells(linha, 14).Value = navegadorChrome.FindElementByXPath("/html/body/div[1]/div[4]/div[1]/div[1]/table[1]/tbody[1]/tr[1]/td[3]").Text
方法2:获取父节点文本后拆分
如果绝对XPath稳定性差,可以先获取整个<td>的文本内容,再按分隔符拆分出目标信息:
Dim statusTdText As String statusTdText = navegadorChrome.FindElementByXPath("/html/body/div[1]/div[4]/div[1]/div[1]/table[1]/tbody[1]/tr[1]/td[1]").Text ' 拆分出状态内容(假设span文本为"Status:") Cells(linha, 12).Value = Trim(Split(statusTdText, ":")(1))
优化方案:使用相对定位提高稳定性
避免依赖绝对XPath,改用CSS选择器或相对定位定位物流表格,代码更健壮:
' 定位物流事件表格 Dim eventoTable As Object Set eventoTable = navegadorChrome.FindElementByCss("table.tabelaEventos") ' 获取第一行的所有td元素 Dim tdElements As Object Set tdElements = eventoTable.FindElementsByTagName("td") ' 提取状态(拆分第一个td的文本) Cells(linha, 12).Value = Trim(Split(tdElements(0).Text, ":")(1)) ' 提取日期 Cells(linha, 13).Value = tdElements(1).Text ' 提取地点 Cells(linha, 14).Value = tdElements(2).Text
内容的提问来源于stack exchange,提问作者Fernando Barreto
相关产品推荐
相关产品推荐

