vba通过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)。单击? 我在网上搜索过,似乎找不到关于这个主题的任何东

我是一个初学者的网页抓取与excel vba和需要一些帮助

我试图引用一个元素。如果有id,那么我可以使用getElementByID,但有时没有id。我可以使用getElementByClassName,但有时同一个类的元素太多

有没有办法通过xpath引用元素

(我不能发布实际的网站,因为有个人信息,所以让我们假设这是html)


是否有类似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