vba通过xpath引用html元素

时间:2017-08-15 17:01:59

标签: html vba web-scraping

我是使用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? 我在网上搜索过,似乎无法找到关于这个话题的任何内容。

2 个答案:

答案 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/