我试着合并代码部分,我可以使工作,但它是工作与,但它是不工作与谁能帮助使它的工作?
我试图得到:https://www.lego.com/cdn/cs/set/assets/blt34360a0ffaff7811/11015_alt.png?fit=bounds&format=png&width=800&height=800&dpr=1从以下代码:
<img src="https://www.lego.com/cdn/cs/set/assets/blt34360a0ffaff7811/11015_alt.png?fit=bounds&format=png&width=800&height=800&dpr=1" alt="" class="Imagestyles__Img-sc-1qqdbhr-0 cajeby">
Code part where i want to get the Src url
Sub picgrab()
Dim Doc As Object
Dim nodeAllPic As Object
Dim nodeOnePic As Object
Dim pic As Object
Set Doc = CreateObject("htmlFile")
With CreateObject("MSXML2.XMLHTTP.6.0")
url = "https://www.lego.com/hu-hu/product/around-the-world-11015"
.Open "GET", url, False
.setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:91.0) Gecko/20100101 Firefox/91.0"
.send
' It is important that i can't use InternetExplorer.
'This should work i guess, but it skips after 'For Each' line.
Set nodeAllPic = Doc.getElementsByClassName("Imagestyles__Img-sc-1qqdbhr-0 cajeby")
For Each nodeOnePic In nodeAllPic
If nodeOnePic.getAttribute("class") = "Imagestyles__Img-sc-1qqdbhr-0 cajeby" Then
Set pic = nodeOneVip.getElementsByClassName("Imagestyles__Img-sc-1qqdbhr-0 cajeby")(0)
ActiveCell.Value = pic.getAttribute("src")
End If
Next nodeOnePic
End With
End Sub
我厌倦了上面的代码,并修改了它的许多方式,但不能得到的Src="”的内容。
1条答案
按热度按时间qpgpyjmq1#
需要写入响应
首先,你从来没有为
htmlfile
对象编写HTML响应,所以当你调用getElementsByClassName
方法时,你什么也找不到。在尝试使用
Doc
对象之前,请确保包含以下行:动态内容
其次,该页面上的一些内容不在
XMLHTTP
接收的原始HTTP请求中,该页面包含动态加载内容的JavaScript代码。要在Chrome中测试这一点,您可以打开该页面上的Chrome DevTools窗口,然后disable JavaScript并刷新页面。
然后,您将看到原始HTML和一个通知,说明JavaScript已禁用。
现在,如果您在Elements选项卡中搜索,您将找不到您要查找的元素(至少我找不到任何带有类“cajeby”的元素)。
浏览器仿真
那么,现在该怎么办呢?你需要使用一个对象来操纵原始响应以执行JavaScript代码。为此,你可以使用Selenium。这是使用VBA进行web抓取或任何浏览器自动化的现代方法。
您可以很容易地找到关于如何开始使用Selenium for VBA的教程,但我会推荐WiseOwlTutorials的这款video。
那么您的代码可能如下所示:
关于代码的一些注解
FindElementByCss
的使用,这是必要的,因为您使用了2个类名,并且目前没有其他方法支持它,但是您需要使用CSS选择器语法(更多关于here的信息)。timeout:=5000
的使用,它让Selenium知道您愿意等待最多5000毫秒,以便JavaScript代码加载您正在查找的内容(更多详细信息here)。