vba通过xpath引用html元素
我是一个初学者的网页抓取与excel vba和需要一些帮助 我试图引用一个元素。如果有id,那么我可以使用getElementByID,但有时没有id。我可以使用getElementByClassName,但有时同一个类的元素太多 有没有办法通过xpath引用元素 (我不能发布实际的网站,因为有个人信息,所以让我们假设这是html)vba通过xpath引用html元素,html,vba,web-scraping,Html,Vba,Web Scraping,我是一个初学者的网页抓取与excel vba和需要一些帮助 我试图引用一个元素。如果有id,那么我可以使用getElementByID,但有时没有id。我可以使用getElementByClassName,但有时同一个类的元素太多 有没有办法通过xpath引用元素 (我不能发布实际的网站,因为有个人信息,所以让我们假设这是html) 是否有类似ie.document.getElementByXPath的内容。(/html/body/a)。单击? 我在网上搜索过,似乎找不到关于这个主题的任何东
是否有类似ie.document.getElementByXPath的内容。(/html/body/a)。单击?
我在网上搜索过,似乎找不到关于这个主题的任何东西。这不是答案 这里有几个潜艇可以给你一些想法
Sub google()
' add reference: Microsoft XML v6.0
Const url = "https://www.google.co.in"
Dim http As New XMLHTTP60
Dim html As New HTMLDocument
http.Open "GET", url, False
http.Send
html.body.innerHTML = http.responseText
Dim elem As Object
Set elem = html.getElementsByClassName("ctr-p") ' HTMLElementCollection
Debug.Print elem.Length
Set elem = html.getElementsByClassName("ctr-p")("viewport") ' HTMLDivElement <div class="ctr-p" id="viewport">
Debug.Print elem.Children.Length
Dim aaa As Object
Set aaa = elem.getElementsByTagName("div")("hplogo") ' HTMLDivElement
Debug.Print aaa.Children.Length
Debug.Print aaa.outerHTML
End Sub
Sub-google()
'添加参考:Microsoft XML v6.0
常量url=”https://www.google.co.in"
Dim http作为新的XMLHTTP60
Dim html作为新的HTMLDocument
http.Open“GET”,url,False
http.Send
html.body.innerHTML=http.responseText
作为对象的模糊元素
设置elem=html.getElementsByClassName(“ctr-p”)'HTMLElementCollection
调试.打印元素长度
Set elem=html.getElementsByClassName(“ctr-p”)(“viewport”)htmldevelment
Debug.Print elem.childrence.Length
将aaa作为对象
设置aaa=elem.getElementsByTagName(“div”)(“hplogo”)“htmlLevel”
调试。打印aaa.childrence.Length
Debug.Print aaa.outerHTML
端接头
添加引用Microsoft HTML对象库
“Microsoft Internet控件
副秘书长()
常量url=”https://www.google.co.in"
Dim iE作为InternetExplorer
Set iE=新的InternetExplorer
浏览网址
可见=真实
Do While iE.ReadyState 4:DoEvents:Loop
作为HTMLDocument的Dim doc
设置文档=即文档
Debug.Print doc.ChildNodes.Length'DOMChildrenCollection
Debug.Print doc.ChildNodes(1.ChildNodes.Item(0.nodeName)头
Debug.Print doc.ChildNodes(1.ChildNodes.Item(1.nodeName)正文
'有关querySelector参数,请参见:https://www.w3schools.com/cssref/css_selectors.asp
Dim elm作为一个元素
设置elm=doc.querySelector(“*”)所有元素
调试。向左打印(elm.outerHTML,40)
设置elm=doc.querySelector(“div.ctr-p#viewport”)'
调试。向左打印(elm.outerHTML,40)
Set elm=doc.querySelector(“.ctr-p#viewport”)'
调试。向左打印(elm.outerHTML,40)
Debug.Print elm.ChildNodes.Length
Debug.Print elm.childrence.Length
Set elm=doc.querySelector(#viewport“)id=“viewport”
调试。向左打印(elm.outerHTML,40)
Debug.Print elm.ID
作为HTMLInputElement的Dim elem
Set elem=doc.getElementsByClassName(“ctr-p”)(“视口”)
Debug.Print elem.childrence.Length
将aaa作为对象
设置aaa=elem.getElementsByTagName(“div”)(“hplogo”)
调试。打印aaa.childrence.Length
Debug.Print aaa.outerHTML
即退出
设置iE=无
端接头
您可以使用Selenium Webdriver()在Excel VBA中执行此操作 Webdriver确实有一个FindElementByXPath方法。它的优点是可以控制Internet Explorer以外的其他浏览器,但缺点是需要在每台运行VBA脚本的机器上安装Selenium 下面是安装Selenium并将其库引用添加到项目中的演练(这是我使用的教程;这是一个pt br页面,但我将其放入google以进行自动翻译):
这里还有另一个来自编码is Love的快速入门(它没有安装演练):我想您可能指的是按属性选择元素。例如,获取
href==“google.com”
所在的元素。我说得对吗?如果(如果)HTML是有效的XHTML,那么它就是有效的XML,可以由MSXML库处理,它提供了您想要的功能。不是xpath,而是queryselector[all]
接近您的要求:请看这篇文章。querySelector()参数
Sub google()
' add reference: Microsoft XML v6.0
Const url = "https://www.google.co.in"
Dim http As New XMLHTTP60
Dim html As New HTMLDocument
http.Open "GET", url, False
http.Send
html.body.innerHTML = http.responseText
Dim elem As Object
Set elem = html.getElementsByClassName("ctr-p") ' HTMLElementCollection
Debug.Print elem.Length
Set elem = html.getElementsByClassName("ctr-p")("viewport") ' HTMLDivElement <div class="ctr-p" id="viewport">
Debug.Print elem.Children.Length
Dim aaa As Object
Set aaa = elem.getElementsByTagName("div")("hplogo") ' HTMLDivElement
Debug.Print aaa.Children.Length
Debug.Print aaa.outerHTML
End Sub
' add references Microsoft HTML Object Library
' Microsoft Internet Controls
Sub ieGoogle()
Const url = "https://www.google.co.in"
Dim iE As InternetExplorer
Set iE = New InternetExplorer
iE.Navigate url
iE.Visible = True
Do While iE.ReadyState <> 4: DoEvents: Loop
Dim doc As HTMLDocument
Set doc = iE.Document
Debug.Print doc.ChildNodes.Length ' DOMChildrenCollection
Debug.Print doc.ChildNodes(1).ChildNodes.Item(0).nodeName ' HEAD
Debug.Print doc.ChildNodes(1).ChildNodes.Item(1).nodeName ' BODY
' for querySelector arguments see: https://www.w3schools.com/cssref/css_selectors.asp
Dim elm As HTMLInputElement
Set elm = doc.querySelector("*") ' all elements
Debug.Print Left(elm.outerHTML, 40)
Set elm = doc.querySelector("div.ctr-p#viewport") ' <div class="ctr-p" id="viewport">
Debug.Print Left(elm.outerHTML, 40)
Set elm = doc.querySelector(".ctr-p#viewport") ' <div class="ctr-p" id="viewport">
Debug.Print Left(elm.outerHTML, 40)
Debug.Print elm.ChildNodes.Length
Debug.Print elm.Children.Length
Set elm = doc.querySelector("#viewport") ' id="viewport"
Debug.Print Left(elm.outerHTML, 40)
Debug.Print elm.ID
Dim elem As HTMLInputElement
Set elem = doc.getElementsByClassName("ctr-p")("viewport")
Debug.Print elem.Children.Length
Dim aaa As Object
Set aaa = elem.getElementsByTagName("div")("hplogo")
Debug.Print aaa.Children.Length
Debug.Print aaa.outerHTML
iE.Quit
Set iE = Nothing
End Sub