【发布时间】:2018-03-15 01:09:49
【问题描述】:
我正在用 VBA for Excel 编写一个检查页面的宏,我需要提取一个在 HTML 脚本中设置的变量。在宏中,我就这样创建了一个 IE 对象:
Set objIE = CreateObject("InternetExplorer.Application")
目标网站中的页面都有以下脚本,该脚本定义了一个名为digitalData.page.pageName 的变量。这是 HTML 的 sn-p:
<script>
var digitalData = '';
function init() {
digitalData = {
"user": {
"userLoginState": "guest",
"userCountry": "",
"userEmployeeName": "",
"userBirthday": "",
"userGender": "",
"userState": "",
"userID": "",
"LRUserID": "",
"userEmployeeID": "",
"userDWID": "",
"userSessionId": "BYTEzHFAdLrPoPPOlTPGWvlBjCx54jjEyB8="
},
"page": {
"pageName": "en_us:plp:men:clothing:Casual Shirts",
"pageType": "plp",
"pageGender": "men",
"pageLocale": "us",
"pageRedirected": "no",
"pageJSErrorCount": "3",
"pageLevel1": "men",
"pageLevel2": "men/clothing",
"pageLevel3": "men/clothing/Casual Shirts",
"pageLevel4": "men/clothing/Casual Shirts",
"pageHierarchy": "men/clothing/Casual Shirts"
},
如果我在 Chrome 中打开此站点的页面并检查它,我可以在控制台中键入变量名称,它会返回值,但我似乎无法使用 VBA 从 IE 访问变量,如下所示:
inspectLink(i, 1) = objIE.digitalData.page.pageName
在这种情况下,我想在inspectLink(i, 1) 中找到en_us:plp:men:clothing:Casual Shirts,但我却得到了Runtime error '438' Object doesn't support the property or method。
Dim inspectCat(4) As String
inspectCat(0) = "webcat=men"
inspectCat(1) = "webcat=women"
inspectCat(2) = "webcat=kids"
inspectCat(3) = "webcat=baby"
inspectCat(4) = "webcat=home"
Dim targetSearchCount as Integer
Dim failedSearchCount as Integer
targetSearchCount=0
failedSearchCount=0
REM New Code - DOES NOT WORK cannot access pageName this way
REM if digitalData.page.pageName has en_us: in it, then it's our target
REM if it has failedSearchResult in it, then report to web dev team
REM syntax might be objIE.Document.digitalData.page.pageName
REM inspectLink(i, 1) = objIE.digitalData.page.pageName
REM MsgBox inspectLink(i, 1)
REM if inStr(objIE.digitalData.page.pageName, "en_us:") then targetSearchCount=targetSearchCount+1 endif
REM if inStr(objIE.digitalData.page.pageName, "failed_Search_Result") then failedSearchCount=failedSearchCount+1 endif
REM End New Code
REM Begin Old Code - WORKS BUT "dublicate" MAY NOT BE RELIABLE OVER TIME
REM
Set pageNameDubs = objIE.Document.GetElementsByClassName("page-Name-dublicate")
'MsgBox pageNameDubs(0).Value
For Each pageName In pageNameDubs
' If InStr(pageName.innertext, "en_us:") > 0 Then
inspectLink(i, 1) = pageName.Value
' End If
Next
REM End Old Code
【问题讨论】:
-
inspectLink是什么?是否声明了对象?如何?如果没有看到您所看到的内容,则无法进行故障排除。请将您的 VBA 添加到问题中。请参阅 minimal reproducible example -
感谢您的提示。完成。
-
杰罗姆,你有机会试试我的答案吗?谢谢!
-
抱歉,我遇到了其他问题。 “重复”查询目前有效,因此改进它不在优先级列表的顶部。当我尝试让它发挥作用时,我一定会通知你的。
标签: javascript vba excel web-scraping