使用getElementsByClassName抓取网站->错误的结果

时间:2018-11-09 11:14:02

标签: html vba ms-access web-scraping screen-scraping

我正在尝试在以下HTML代码段中抓取所有具有className =“ disabled”的类的innerText: HTML code

我试图在MS Access(VBA)中实现的代码如下:

Set IE = CreateObject("InternetExplorer.Application")

claimLink = "https://www.XXXXX.com/"


IE.navigate claimLink
    Do
       DoEvents
    Loop Until IE.ReadyState = 4

Set menuEnabled = IE.Document.getElementsByClassName("disabled")(0)


For Each Item In menuEnabled
    MsgBox (Item.innerText & " --> " & Item.className)
Next

IE.Quit

Set menuEnabled = Nothing
Set searchres = Nothing
Set IE = Nothing

...但是,结果是,我得到了该列表中的所有项目,MS Access还说所有项目(书目数据,描述,索赔等)的类名称都被“禁用”。

有人可以告诉我我的代码有什么问题吗?我只想返回“描述”,“索赔”和“被引文件”。

These Grey items are the only items I want to be replied

谢谢! 科内留斯

1 个答案:

答案 0 :(得分:1)

似乎需要短暂等待更新元素。我正在使用css选择器组合来定位感兴趣的元素。

.epoContentNav [class=disabled]

"."是一个类选择器。它选择在"."之后(即epoContentNav之后具有类名匹配的元素。 " "是后代组合器,表示右边的是左边的子级。 []是一个属性选择器,它通过内部命名的属性选择一个元素。在这种情况下,我使用attribute=value组合来指定类名称必须为disabled。整个内容将作为具有类disabled的父级的具有类epoContentNav的查找元素来读取。它选择所有类别为disabled的导航栏元素。

有关这些选择器here.

的信息
Option Explicit    
Public Sub GetInfo()
    Dim IE As New InternetExplorer, i As Long, nodeList

    With IE
        .Visible = True
        .navigate "https://worldwide.espacenet.com/publicationDetails/claims?DB=&ND=&locale=en_EP&FT=D&CC=DE&NR=1952914A&KC=A&tree=false#"

        While .Busy Or .readyState < 4: DoEvents: Wend

        Application.Wait Now + TimeSerial(0, 0, 2)

        Set nodeList = .document.querySelectorAll(".epoContentNav [class=disabled]")
        For i = 0 To nodeList.Length - 1
            Debug.Print nodeList.item(i).innerText, nodeList.item(i).getAttribute("class")
        Next
        Stop
        'Quit '<== Remember to quit application
    End With
End Sub