【发布时间】:2018-11-29 17:26:18
【问题描述】:
在本主页“http://www.kpia.or.kr/index.php/year_sugub”
如果你检查 html,从 li1 到 li6 有 6 个 id。第一次使用chromedriver后,我注意到的第一件事就是wait方法无效。所以我在这个主页上搜索了各种优化点击互联网后等待的方法。 例如,我应用了以下三种编码。
ex1) Application.Wait Now + TimeSerial (0, 0, 5)
ex2) .FindElementById("li2", timeout: = 10000) .Click
ex3) '做 'DoEvents '错误继续下一步 '设置 ele = .FindElementById ("li2") '在错误转到 0 'If Timer - t = 10 Then Exit Do'
但是,如果不使用 Application.Wait Now + TimeSerial (0, 0, 5),我们最终无法找到优化等待方法的方法。此方法在点击li2后未完全加载,但偶尔会执行额外的任务。
于是,我想到了一种形式化的编码逻辑,以后可以偶尔用它来做类似的编码,我想出了以下逻辑。例如,在 li2 中,Ethylene 的值始终与结果值是固定值,因此如果单击 li2 然后查找“SM”值,数据将加载到工作表中。接下来,li3中的“LDPE”是加载完成后将数据粘贴到工作表中的方式。所以我在用这个想法进行编码,而我在处理 VBA 时无法解决错误。
Dim d As WebDriver, ws As Worksheet, clipboard As Object
Set d = New ChromeDriver
Set ws = ThisWorkbook.Worksheets("Sheet3")
Set clipboard = GetObject("New:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
Const URL = "http://www.kpia.or.kr/index.php/year_sugub"
Dim html As HTMLDocument
Set html = New HTMLDocument
With d
.AddArgument "--headless"
.Start "Chrome"
.get URL, Raise:=False
rep:
.FindElementById("li2", timeout:=10000).Click
Dim Posts As WebElements
Dim elem As WebElements
Dim a1 As Integer
For Each Posts In .FindElementsByClass("bbs")
For Each elem In Posts.FindElementsByCss("td")
If Not elem.Text = "SM" Is Nothing Then
html.body.innerHTML = d.PageSource
Dim tarTable As HTMLTable
Dim hTable As HTMLTable
For Each tarTable In html.getElementsByTagName("table")
If InStr(tarTable.className, "bbs") <> 0 Then
Set hTable = tarTable
End If
Next
clipboard.SetText .FindElementById("table_body").Attribute("outerText")
clipboard.PutInClipboard
else
goto rep
end if
.Quit
End With
如果找到与 SM 值匹配的值,则假定加载完成并继续将相关数据传输到剪贴板。如果没有找到 SM 值,使用 GOTO 使用 .FindElementById ("li2" timeout: = 10000)。我想我可以通过创建一个从 .Click 重新启动的循环来修复它。
我是一个初学者,正在阅读中节省时间和努力学习,所以如果您能给我更多帮助,我将不胜感激。
【问题讨论】:
-
这一行
If Not elem.Text = "SM" Is Nothing Then应该失败,因为只有对象可以是 Nothing 并且Not elem.Text = "SM"是布尔值。这段代码能运行吗? -
铁人。我知道了。谢谢你的评论。我会试试的
标签: vba selenium web-scraping selenium-chromedriver wait