我是使用excel vba进行网页抓取的初学者,需要一些帮助。
我正在尝试引用一个元素。如果有id,那么我可以使用getElementByID,但有时候没有id。我可以使用getElementByClassName,但有时同一类的元素太多了。
有没有办法通过xpath引用元素?
(由于有个人信息,我无法发布实际网站,所以让我们说这是html)
<!DOCTYPE html>
<html>
<body>
<a href="https://google.com">Link</a>
</body>
</html>
有类似ie.document.getElementByXPath。(/ html / body / a).click? 我在网上搜索过,似乎无法找到关于这个话题的任何内容。
答案 0 :(得分:1)
这不是一个答案
这里有几个可能会给你一些想法的潜艇
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
答案 1 :(得分:0)
您可以使用Selenium Webdriver(https://www.selenium.dev/)在Excel VBA中执行此操作。
Webdriver确实具有FindElementByXPath方法。它的优点是可以控制Internet Explorer以外的其他浏览器,但缺点是需要在每台运行VBA脚本的计算机上安装Selenium。
这里是安装Selenium并将其库引用添加到您的项目的演练(这是我使用的教程;这是pt-br页面,但我放入Google进行自动翻译):https://translate.google.com/translate?sl=pt&tl=en&u=https%3A%2F%2Fwww.tomasvasquez.com.br%2Fblog%2Fmicrosoft-office%2Fexcel%2Fvba-interagindo-com-paginas-web-com-o-selenium-webdriver%2F >
这是Coding is Love的另一个快速入门(没有安装演练):https://codingislove.com/browser-automation-in-excel-selenium/