VBA 网页抓取问题 - 如何使用 html 结构(href / child/)导航特定网页

Posted

技术标签:

【中文标题】VBA 网页抓取问题 - 如何使用 html 结构(href / child/)导航特定网页【英文标题】:VBA web scraping issue - how to navigate specific web using html structure (href / child/ ) 【发布时间】:2021-11-11 05:16:11 【问题描述】:

亲爱的 VBA 同事你好 :)

Sub login()
'test 
    Const URL$ = "https://kwm.kromi.de/cgi-bin/kwm?html=frontend/login.htm"
    Dim UserName As String, Password As String, LoginData As Worksheet
    Set LoginData = ThisWorkbook.Worksheets("Sheet1")
    UserName = LoginData.Cells(1, "B").Value
    Password = LoginData.Cells(2, "B").Value
    Dim IE As Object
    Set IE = CreateObject("InternetExplorer.Application")
    With IE
        .Visible = False
        .Navigate URL
        ieBusy IE
        .Visible = True
       Dim oLogin As Object, oPassword As Object
        Set oLogin = .document.getElementsByName("VS_LOGIN")(0)
        Set oPassword = .document.getElementsByName("VS_PASSWORD")(0)
        oLogin.Value = UserName
        oPassword.Value = Password
        .document.forms(0).submit
        ieBusy IE
       Stop
       '.document.getElementsByTagName("a")(2).href
       '.document.getElementsByClassName("link3").Click
     .Navigate2 ""
     ieBusy IE
     Stop
    End With
'''
End Sub
Sub ieBusy(IE As Object)
    Do While IE.Busy Or IE.readyState < 4
        DoEvents
    Loop
End Sub

第一个任务是工作,宏登录网站。我需要更深入地点击一些东西,但网络结构对我的小脑袋来说太多了我正在网站上寻找一些例子,但没有任何效果。我在下面显示了网站的代码。我需要点击按钮“statystyka”。

/html/body/div[1]/div[1]/a[2] - Xpath 地址 [链接图片]https://ibb.co/2Pgx2tn

请给我一些帮助:)

编辑: 我尝试使用这样的东西: '.document.getElementsByTagName("a")(2).href 但这不是很好的思考方式

【问题讨论】:

nothing work 是什么意思?您是否单击它但没有任何反应或有什么错误? 看起来这个链接实际上运行了一个 javascript,所以谷歌在ExecScript 上了解如何使用 IE 执行 Javascript。 @Raymond Wu ,对于我来说,问题是如何导航这种文档结构,它与 html 结构和 html 的依赖关系(doc -> head ->div 等)有关。我不知道如何以核心方式选择行(我认为有 html 和 vba 经验的人知道如何做到这一点):&lt;a href="" onclick="OneInOne('https://kwm.kromi.de:443/cgi-bin/kwm?HTML=frontend/statistic/stat_current.htm&amp;amp;ID=C466409C6997DADCE06C38B36731BA92',6); return false;"&gt;Statystyka&lt;/a&gt; 我试过这样的事情'.document.getElementsByTagName("a")(2).href 我创建了一个简单的示例来测试 QHarr 的答案,并且效果很好。但是,我们无法访问您提供的页面,因此恐怕您无法重现您的问题。 @Raymond Wu 我正在等待 QHarr 的回复,也许他有一些想法或其他方式可以尝试。 【参考方案1】:

如果你想通过标签导航你需要如下设置框架

Dim doc As HTMLDocument
Dim doc2 As HTMLDocument
Dim lnk As HTMLLinkElement

Set doc = IE.document
 Set doc2 = doc.frames("Navigator").document
 Set lnk = doc2.getElementsByTagName("A")(1)
 lnk.Click

@QHarr @Raymond Wu :) 感谢您尝试帮助,也许这将是其他人的解决方案

【讨论】:

【参考方案2】:

您需要移动到适当的框架,在我使用时添加一个等待。导航到框架src,然后您可以通过onclick 属性的子字符串定位:

ie.navigate ie.document.querySelector("[name=Navigator]").src
ieBusy ie
ie.document.querySelector("[onclick*=statistic]").click

【讨论】:

您好,谢谢@QHarr,我尝试了您的代码ie.navigate ie.document.querySelector("[name=Navigator]").src 在此行之后导航到带有菜单栏的站点ie.document.querySelector("[onclick*=statistic]").click 在此行之后网络注销到登录网站。你有想法吗? 点击退出? 谢谢你亲爱的同事你的回答我试着在图片上显示你,通常当你手动点击你收到这样的东西(ibb.co/WykqLnW)使用 VBA 它看起来像这样(ibb.co/bLfsNpK ) 并且结果被注销 (ibb.co/mtPc1KS) 这个按钮的选择方式有那么不同吗?你知道任何可能性吗? 尝试将ie.document.querySelector("[onclick*=statistic]").clickie.document.parentWindow.ExecScript Replace$(ie.document.querySelector("[onclick*=statistic]").getAttribute("onclick"), " return false;", "") 放在一起 - 另外,在这两者之间还有其他步骤吗?

以上是关于VBA 网页抓取问题 - 如何使用 html 结构(href / child/)导航特定网页的主要内容,如果未能解决你的问题,请参考以下文章

如何在 VBA 中获取标签的内部文本,不包括嵌套标签中的文本?

Web在VBA中仅抓取网页的特定部分

如何使用 VBA 刷新 IE

如何抓取HTML页面数据

使用VBA宏遍历javascrape网页上的每个表

c#抓取动态网页中的数据