我已经使用IE在vba中编写了一个脚本,以从网页中获取不同酒店名称的标题。旅馆名称通过分页遍历多页。
我的抓取器可以在解析每个页面的标题的同时继续成功单击下一个按钮,直到不再单击该按钮来执行。解析器所做的只是完美的工作。我只想知道下面是我问过的简单逻辑。
我的问题:即使在Set Htmldoc = IE.document
之后不使用此.click
行,如何正确显示每个页面的内容?启动点击后,抓取工具会转到带有新内容的新页面。当我定义的do loop
出现在with IE
块之后时,它如何通过每个页面的新内容进行更新?
这是脚本:
Sub GetTitles()
Const Url As String = "https://www.tripadvisor.com/Hotels-g147237-Caribbean-Hotels.html"
Dim IE As New InternetExplorer, Htmldoc As HTMLDocument, post As Object, R&
With IE
.Visible = True
.navigate Url
While .Busy = True Or .readyState < 4: DoEvents: Wend
Set Htmldoc = .document
End With
Do
For Each post In Htmldoc.getElementsByClassName("listing") ''how this "Htmldoc" gets updated
With post.getElementsByClassName("property_title")
If .Length Then R = R + 1: Cells(R, 1) = .Item(0).innerText
End With
Next post
If Not Htmldoc.querySelector(".standard_pagination span[onclick*='pagination_next']") Is Nothing Then
Htmldoc.querySelector(".standard_pagination span[onclick*='pagination_next']").Click
Application.Wait Now + TimeValue("00:00:05")
''I didn't use anything like "Set Htmldoc = IE.document" but it still works flawlessly
Else:
Exit Do
End If
Loop
IE.Quit
End Sub
答案 0 :(得分:3)
脚本没有错误。但是,如果您在没有完全理解的情况下使用它,肯定会很麻烦。
执行此操作Set Htmldoc = .document
时,您正在设置IE的文档以供以后使用。
执行此操作时,Htmldoc.querySelector(".standard_pagination span[onclick*='pagination_next']").Click
会使用javascript,并更新页面的内容(即文档)。
您可能认为文档已更改,但仅是更新的。实际上,根本没有导航发生。
添加以下内容,看看页面/文档保持不变,只是内容发生了变化。
'/ Url before Next button click
Debug.Print "Before Click " & Htmldoc.Url
Htmldoc.querySelector(".standard_pagination span[onclick*='pagination_next']").Click
'/ Url after Next button click
Debug.Print "After Click " & Htmldoc.Url
自文档以来,一旦设置就保持不变,并且更新后的内容具有相同的布局/ DOM (这是大多数程序员编写代码的方式,很可能所有页面都使用模板来呈现),因此您代码工作得很好。您的do循环的网对网,什么都没有改变。
答案 1 :(得分:0)
Set Htmldoc = .document
获取指向DOM的指针。当Htmldoc更改时,它指向新内容。无需执行新的Set Htmldoc