抓取嵌套的Web VBA标签

时间:2018-08-07 17:00:44

标签: html vba web-scraping nested screen-scraping

如果我在链接中找到这样嵌套的标签,则在用vba进行网页抓取时总是遇到问题

http://forebet.com

从左侧菜单中删除链接数据,但是当我进入嵌套在英格兰,西班牙的锦标赛时我错了

Sub championshipforebet()
Dim objIE As Object
Dim itemEle As Object
Dim itemEle1 As Object
Dim away As Object
Dim desc As String, pt1 As String, pt2 As String, price As String
Dim i As Integer
Cells.Select
Selection.ClearContents
Selection.NumberFormat = "@"
Set objIE = CreateObject("internetexplorer.application")
objIE.Visible = True
objIE.navigate "https://www.forebet.com/it/"
Do While objIE.Busy = True Or objIE.readyState <> 4: DoEvents: Loop
Set itemEle = objIE.document.getElementsByClassName("moduletable_foremenu")(1)
Set itemEle1 = itemEle.getElementsByClassName("tree_foremenu")
i = 1
For Each ele1 In itemEle1(0).getElementsByTagName("li")
    i = i + 1
    Cells(i, 1) = ele1(0).getElementsByClassName("mainlevel_foremenu").href
Next ele1


End Sub

2 个答案:

答案 0 :(得分:1)

您可以使用包括OR运算符","在内的css选择器。另外,使用XMLHTTPRequest (XHR)检索数据要比打开IE快得多。


链接位于两个类别之一中:

最高级别的课程:

mainlevel_foremenu

img 1

嵌套的有类:

sublevel_foremenu

img2


您可以使用CSS选择器组合来获取这两个类中的任何一个的所有元素,并将它们与OR运算符组合在一起。

a.mainlevel_foremenu,a.sublevel_foremenu

a表示a标记(element selector),而.class selector。因此,带有a标签的元素具有类名mainlevel_foremenu或(","sublevel_foremenu。在这种情况下实际上不需要a,因此您可以缩短为.mainlevel_foremenu, .sublevel_foremenu

CSS选择器返回多个项,因此.querySelectorAll的{​​{1}}方法用于返回document。然后迭代nodeList的长度以按索引访问各个链接。

链接是相对的,因此nodeList函数用于删除Replace,并且基本路径以链接地址为前缀。


如果我们看一下页面上的第一个开关:

img

组合的CSS选择器结果表明,我们也获得了嵌套级别(请注意,我已经删除了一些中间结果)。

img


VBA:

"about:"

样本结果:

sample


参考(VBE>工具>参考):

  1. Microsoft HTML对象库

答案 1 :(得分:1)

尽管两个答案之间没有显着差异,但我决定发布我的答案,因为我已经创建了一个答案。 for loop部分和split函数可能对将来的读者有所帮助。正如QHarr所描述的关于.querySelector()的情况一样,我不再重复。

这也是您可以尝试的代码:

Sub GrabLinks()
    Const Baseurl$ = "https://www.forebet.com"
    Dim S$, I&

    With New XMLHTTP60
        .Open "GET", Baseurl & "/", False
        .send
        S = .responseText
    End With

    With New HTMLDocument
        .body.innerHTML = S
        With .querySelectorAll(".mainlevel_foremenu,.sublevel_foremenu")
            For I = 0 To .Length - 1
                Cells(I + 1, 1) = Baseurl & Split(.Item(I).getAttribute("href"), "about:")(1)
            Next I
        End With
    End With
End Sub

要添加到库中的引用:

Microsoft XML, v6.0
Microsoft HTML Object Library