【问题标题】:How to determine the URL of a single-page application based on HTML code如何根据 HTML 代码确定单页应用的 URL
【发布时间】:2018-09-15 02:14:01
【问题描述】:

我需要从使用单页应用程序代码 (https://www.rigzone.com/oil/jobs/search/) 的网页中删除信息,只需在“搜索”字段中加载内容并单击按钮,然后使用底部的箭头在页面之间跳转,您会注意到在此过程中,顶部栏中显示的 URL 保持不变。我假设(如果我错了,请纠正我)有一种方法可以显示与发布的不同位置的每个页面对应的 URL。理想情况下,我想确定那些在我的脚本中打开它们,提取 HTML 代码并在 VBA xmlhttp 的帮助下提取我想要的信息。我该怎么做?

或者,我可以在底部找到与“下一步”按钮相对应的元素,并在删除数据的脚本中激活它,这可能会容易得多,但我对第一种方式很好奇。

谢谢!

【问题讨论】:

    标签: vba web-scraping xmlhttprequest


    【解决方案1】:

    这里有一些非常丑陋的代码需要改进,它使用 IE 并根据每页 20 个结果不断单击“下一步”按钮以获得预期的页数。

    如果有办法构造为 POST XMLHTTPRequest,我会沿着这条路线走。如果有 API 就更好了。

    Option Explicit
    Public Sub LoopPages()
        Dim IE As New InternetExplorer, t As Date, num As String, i As Long
        Const MAX_WAIT_SEC As Long = 5
        Const RESULTS_PER_PAGE = 20
    
        With IE
            .Visible = True
            .navigate "https://www.rigzone.com/oil/jobs/search/"
    
            While .Busy Or .readyState < 4: DoEvents: Wend
    
            With .document
                .getElementById("txtSearch").Value = "Health"
                .getElementById("txtLocation").Value = "Paris, France"
                .getElementById("btnBasicSearch").Click
            End With
    
            While .Busy Or .readyState < 4: DoEvents: Wend
    
            Application.Wait Now + TimeSerial(0, 0, 4)
            t = Timer
    
            Do
                On Error Resume Next
                num = Split(Split(.document.querySelector(".rz-table-dd-sm + div").innerText, "of ")(1), Chr$(32))(0)
                On Error GoTo 0
                If Timer - t > MAX_WAIT_SEC Then Exit Do
            Loop While num = vbNullString
    
            'do stuff with initial page
    
            On Error GoTo errhand
            num = Round(CLng(num) / RESULTS_PER_PAGE, 0)
            num = IIf(num < 1, 1, num)
    
            For i = 1 To num          
                .document.querySelector(".next").Click        
                While .Busy Or .readyState < 4: DoEvents: Wend            
                'other code with new page               
            Next   
            Stop                                     '<== Delete me later   
    errhand:
            .Quit
        End With
    End Sub
    

    CSS 选择器组合是

    .rz-table-dd-sm + div
    

    这使用adjacent sibling selector "+" 来选择类为rz-table-dd-sm 的元素旁边的div"." 是类选择器。

    【讨论】:

    • 感谢代码,它没有回答有关如何获取“隐藏” url 代码的问题,可能正确的答案是不可能做到这一点。另一方面,您的代码允许我遍历页面并提取所需的信息。再次感谢您。有一段代码看不懂,能不能帮我看懂?:Meta Stack Overflownum = Split(Split(.document.querySelector(".rz-table-dd-sm + div" ).innerText, "的 ")(1), Chr$(32))(0)Meta Stack Overflow
    • 没有隐藏的网址。有 javascript 生成的链接。我认为您不太可能访问这些客户端。
    • 它是相邻的兄弟选择器 ahttps://developer.mozilla.org/en-US/docs/Web/CSS/Adjacent_sibling_selectors 更新了答案,提供了更多信息。
    • 这能回答问题吗?
    猜你喜欢
    • 2021-10-27
    • 1970-01-01
    • 2015-03-13
    • 1970-01-01
    • 2017-07-27
    • 2018-12-20
    • 1970-01-01
    • 1970-01-01
    • 2021-11-13
    相关资源
    最近更新 更多