Excel VBA - 网页抓取 - 获取 HTML 表格单元格中的值

2024-01-15

我正在尝试创建一个宏来抓取货物跟踪网站。 但我必须创建 4 个这样的宏,因为每家航空公司都有不同的网站。

我是 VBA 和网页抓取的新手。

我已经整理了适用于 1 个网站的代码。但当我尝试将其复制到另一个时,我陷入了循环。我想这可能是我指代该元素的方式,但正如我所说,我是 VBA 新手,对 HTML 毫无头绪。

我试图从图像中突出显示的行中获取“通知”值。

IMAGE:要提取的“通知”文本 https://i.stack.imgur.com/7mTNm.png下面是我到目前为止编写的陷入循环的代码。 任何对此的帮助将不胜感激。

Sub FlightStat_AF()

Dim url As String
Dim ie As Object
Dim nodeTable As Object

  'You can handle the parameters id and pfx in a loop to scrape dynamic numbers
  url = "https://www.afklcargo.com/mycargo/shipment/detail/057-92366691"

  'Initialize Internet Explorer, set visibility,
  'call URL and wait until page is fully loaded
  Set ie = CreateObject("InternetExplorer.Application")
  ie.Visible = False
  ie.navigate url
  Do Until ie.readyState = 4: DoEvents: Loop
  
  'Wait to load dynamic content after IE reports it's ready
  'We can do that in a loop to match the point the information is available
  Do
    On Error Resume Next
    Set nodeTable = ie.document.getElementByClassName("block-whisper")
    On Error GoTo 0
  Loop Until Not nodeTable Is Nothing
  
  'Get the status from the table
  MsgBox Trim(nodeTable.getElementsByClassName("fs-12 body-font-bold").innerText)
  
  'Clean up
  ie.Quit
  Set ie = Nothing
  Set nodeTable = Nothing
End Sub

一些基础知识:
对于像现在这样的简单访问,您可以使用 DOM(文档对象模型)的 get 方法。但两者之间有一个重要的区别getElementByID() and getElementsByClassName() / getElementsByTagName().

getElementByID()搜索 html 标签的唯一 ID。这被写为 html 标签的 ID 属性。如果页面保留 html 标准,则只有一个元素具有此唯一 ID。这就是该方法开头的原因getElement.

如果使用该方法时未找到 ID,VBA 将引发运行时错误。因此,该调用被封装在我的另一个答案的循环中,关闭并再次打开错误处理。但在这个问题的页面中,没有相关 html 区域的 ID。

相反,可以直接访问所需的元素。您尝试了访问getElementsByClassName()。这是正确的。但区别就在这里getElementByID().

getElementsByClassName() and getElementsByTagName()首先getElements。这是复数,因为可以有任意多个具有相同类或标签名称的元素。这两种方法都会创建一个 html 节点集合。所有具有所要求的类或标签名称的 html 元素都将在这些集合中列出。

所有元素都有一个索引,就像数组一样。索引从 0 开始。要访问特定元素,必须指定所需的索引。两个类名fs-12 body-font-bold(类名之间用空格分隔,也可以只使用一个类名构建一个节点集合)向节点集合传递2个html元素。您想要第二个,因此必须使用索引 1。

这是使用 IE 查询页面的 VBA 代码:

Sub FlightStat_AF()

Dim url As String
Dim ie As Object

  'You can handle the parameters id and pfx in a loop to scrape dynamic numbers
  url = "https://www.afklcargo.com/mycargo/shipment/detail/057-92366691"

  'Initialize Internet Explorer, set visibility,
  'call URL and wait until page is fully loaded
  Set ie = CreateObject("InternetExplorer.Application")
  ie.Visible = False
  ie.navigate url
  Do Until ie.readyState = 4: DoEvents: Loop
  
  'Wait to load dynamic content after IE reports it's ready
  'We do that with a fix manual break of a few seconds
  'because the whole page will be "reload"
  'The last three values are hours, minutes, seconds
  Application.Wait (Now + TimeSerial(0, 0, 3))
  
  'Get the status from the table
  MsgBox Trim(ie.document.getElementsByClassName("fs-12 body-font-bold")(1).innerText)
  
  'Clean up
  ie.Quit
  Set ie = Nothing
End Sub

编辑:子函数

这个子测试功能:

Sub testFunction()
  Dim flightStatAfResult As String
  flightStatAfResult = FlightStat_AF("057-92366691")
  MsgBox flightStatAfResult
End Sub

这是子函数:

Function FlightStat_AF(cargoNo As String) As String

Dim url As String
Dim ie As Object
Dim result As String

  'You can handle the parameters id and pfx in a loop to scrape dynamic numbers
  url = "https://www.afklcargo.com/mycargo/shipment/detail/" & cargoNo

  'Initialize Internet Explorer, set visibility,
  'call URL and wait until page is fully loaded
  Set ie = CreateObject("InternetExplorer.Application")
  ie.Visible = False
  ie.navigate url
  Do Until ie.readyState = 4: DoEvents: Loop
  
  'Wait to load dynamic content after IE reports it's ready
  'We do that with a fix manual break of a few seconds
  'because the whole page will be "reload"
  'The last three values are hours, minutes, seconds
  Application.Wait (Now + TimeSerial(0, 0, 3))
  
  'Get the status from the table
  result = Trim(ie.document.getElementsByClassName("fs-12 body-font-bold")(1).innerText)
  
  'Clean up
  ie.Quit
  Set ie = Nothing
  
  'Return value of the function
  FlightStat_AF = result
End Function
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Excel VBA - 网页抓取 - 获取 HTML 表格单元格中的值 的相关文章

随机推荐

  • 如何验证 PAC(代理自动配置)文件内的 Socks 5 代理

    如何设置 PAC 文件以使用带有身份验证的 SOCKS 代理 使用这个简单的 PAC 文件作为示例 function FindProxyForURL url host return SOCKS 69 123 133 75 7257 您将如何
  • 尝试向按钮添加触发器以更改按钮的 Content 属性

    我有一个用户控件 上面有一个按钮 UserControl 有一个名为 IsNew 的 DependencyProperty 这是一个布尔值 如果在控件中编辑的对象是新创建的并且尚未写入数据库 则该值设置为 true 否则就是假的 我有一个按
  • 如何使用python识别中文或英文名字[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 给定一堆名字 我们如何找出哪些是中文名 哪些是英文名 对于中文名字 我建立了一个中文姓氏列表来找出中文名字 比如李小龙 李是中国姓氏
  • Chrome 扩展程序安装

    我有 chrome 扩展 它是使用安装程序安装的 该安装程序安装一些进程和浏览器扩展 根据 chrome 安全性更改 独立安装将被阻止 谷歌将阻止本地 Chrome 扩展程序 http thenextweb com google 2013
  • Webkit 浏览器根据 colspan 渲染表格

    请告知我是否出现幻觉 我希望如此 因为我无法根据浏览器正确渲染表格 我希望有人能为我提供解决方案 我的问题是 某些表格在使用 webkit 的浏览器 即 Safari 和 Chrome 中不显示右侧边框 根据帮助下的关于菜单项 我使用的 S
  • VBA 使用 OFT 模板从 Excel 发送电子邮件 - 禁止自动签名

    我创建了一个宏 用于打开 Outlook 电子邮件模板以供用户发送 以及从电子表格中提取的一些附加信息 一切都很顺利 只是 Outlook 会根据用户设置自动附加签名 虽然我可以很容易地关闭自己的签名 但我并不是唯一可能运行此宏的人 电子邮
  • “docker ps -a”是什么意思?

    经常使用 Docker 的任何人都熟悉常用命令docker ps and docker ps a 我知道docker ps列出了 Docker 引擎中所有正在运行的容器 但是 ps 实际上意味着什么 我也知道docker ps a具有还列出
  • 使用 FOP 中的 OutputStream 渲染图像

    我想在 PDF 上渲染图像 该图像将由 FOP 生成 为了渲染图像 我使用标签
  • 手动将搭配添加到 gensim 短语器

    我正在对语言学论文进行主题建模 并使用 Gensim 短语来识别频繁的搭配 我希望能够将术语 do support 和 it clefts 标记为一个单词 因为它们是特定的语言术语 但是 如果我在取出停用词后制作 Gensim 模型 则不会
  • MSHTML:CreateDocumentFromString 而不是 CreateDocumentFromUrl

    我想使用 MSHTML 库来解析字符串变量中的一些 HTML 但是 我不知道该怎么做 我可以轻松解析给定已知 URL 的网页内容 但不能直接解析源 HTML 这可能吗 如果是这样 怎么办 Public Sub ParseHTML sHTML
  • 身份验证和资源服务器之间的 OAuth v2 通信

    我在理解 OAUTH v2 的工作原理时遇到一些困难 The OAuth 版本 2 规范 https datatracker ietf org doc html draft ietf oauth v2 16 section 7 reads
  • 反射式获取项目中的所有包?

    如何反思性地获取项目中的所有包 我从 Package getPackages 开始 但这只获取了与当前包关联的所有包 有没有办法做到这一点 PhilippWendler 的评论让我找到了一种完成我需要的方法 我稍微调整了该方法以使其递归 R
  • 错误 4:从“错误”中选择“消息”,其中“错误”= 1707(也是 1709)

    我使用 WiX 3 8 创建了一个 MSI 安装程序 安装时在 MSI 日志的最后出现此错误 Property C WIXUI INSTALLDIR VALID 1 Logging stopped 8 20 2014 19 15 03 No
  • Keycloak - Infinispan Redis 缓存存储

    目前正在以standalone ha模式设置keycloak集群 以便能够在docker swarm上运行 在 keycloak 中 用户会话缓存在嵌入式 infinispan 存储中 并且 infinispan 可以配置为跨集群的分布式缓
  • 函子定律是否证明了结构的完全保留?

    在文档中数据函子 http hackage haskell org package base docs Data Functor html以下两条被规定为函子法则 所有函子都应遵守 fmap id id fmap f g fmap f fm
  • makecontext 参数 #2 的 C++0x lambda

    我在将 C 0x lambda 函数作为第二个参数传递给makecontext 来自 ucontext h 的签名makecontext is void makecontext ucontext t void int 以前 我能够应用 C
  • 忽略模糊匹配并使用 javascript 添加精确的单词模式匹配

    我正在尝试为我的网站创建一个文本突出显示选项 但我想要精确的单词匹配而不是模糊的单词匹配 我的代码匹配所有类型的实例 并且存在一些区分大小写的问题 如果我们以 Jfiddle 为例 我只想添加这个词cancer 区分大小写不应该成为问题 并
  • 如何从维基百科中获取纯文本

    我想编写一个仅获取维基百科描述部分的脚本 也就是说 当我说 wiki bla bla bla 它将转到维基百科页面为bla bla bla http en wikipedia org wiki Bla Bla Bla 获取以下内容 并将其返
  • 如何在运行时获取NHibernate在代码中生成的SQL?

    我知道您可以通过将 NHibernate 生成的 SQL 连接到 log4net 或通过管道将其输出到控制台 show sql 选项 来查看 NHibernate 生成的 SQL 但是有没有办法在运行时在代码中获取生成的 SQL 我希望能够
  • Excel VBA - 网页抓取 - 获取 HTML 表格单元格中的值

    我正在尝试创建一个宏来抓取货物跟踪网站 但我必须创建 4 个这样的宏 因为每家航空公司都有不同的网站 我是 VBA 和网页抓取的新手 我已经整理了适用于 1 个网站的代码 但当我尝试将其复制到另一个时 我陷入了循环 我想这可能是我指代该元素