vba - 如何根据 HTML 代码确定单页应用的 URL
问题描述
我需要从使用单页应用程序代码 ( https://www.rigzone.com/oil/jobs/search/ ) 的网页中删除信息,只需在“搜索”字段中加载一些内容并单击按钮,然后使用底部的箭头从一个页面跳转到另一个页面,您会注意到在此过程中,顶部栏中显示的 URL 保持不变。我假设(如果我错了,请纠正我)有一种方法可以显示与发布的不同位置的每个页面对应的 URL。理想情况下,我想确定那些在我的脚本中打开它们,提取 HTML 代码并在 VBA xmlhttp 的帮助下提取我想要的信息。我怎样才能做到这一点?
或者,我可以在底部找到与“下一步”按钮相对应的元素,并在删除数据的脚本中激活它,这可能会容易得多,但我对第一种方式很好奇。
谢谢!
解决方案
这是一些非常难看的代码,需要改进,它使用 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
这使用相邻兄弟选择器 "+"
来选择div
具有 class 的元素的下一个rz-table-dd-sm
。"."
是类选择器。
推荐阅读
- javascript - 为什么配置文件是用 commonJS 编写的
- flutter - 如何在构建小部件中使用导航器进行重定向
- c - 无法在 Windows Server 2019 上加载库
- git - 无法推送到 bitbucket 403“身份验证失败”
- app-store - TestFlight“等待审核”
- javascript - 使用useEffect时的无限循环,数组格式化
- c - 创建我的外壳:在我的提示符中用“~”替换主目录。替换主目录子字符串的问题
- java - 单CPU机器的最佳GC线程数
- python - 为什么我在 AWS 服务中的 lambda 函数存在超时问题?
- java - 无法解析方法 addNotification()