Xml Excel/VBA-在循环中使用不同的查询选择器
我有一个问题,不同的网站需要在循环中使用不同类型的QuerySelector(即Xml Excel/VBA-在循环中使用不同的查询选择器,xml,vba,web-scraping,queryselector,Xml,Vba,Web Scraping,Queryselector,我有一个问题,不同的网站需要在循环中使用不同类型的QuerySelector(即GetElementsByCassName,GetElementsByTagName,querySelectorAll等)才能返回结果 目前,如果我在“Set list=html.queryselectoral(ID)”行使用硬编码的修复选择器,则此代码可用于检索网站信息,但如果我尝试根据循环中的工作表行属性query.name使其变为变量,则此代码不起作用 我不确定这是否只是简单地分配了正确的变量类型,但我只是不知
GetElementsByCassName
,GetElementsByTagName
,querySelectorAll
等)才能返回结果
目前,如果我在“Set list=html.queryselectoral(ID)”行使用硬编码的修复选择器,则此代码可用于检索网站信息,但如果我尝试根据循环中的工作表行属性query.name使其变为变量,则此代码不起作用
我不确定这是否只是简单地分配了正确的变量类型,但我只是不知道如何处理使这部分工作
Sub FETCHER()
Dim URL As String, tag As String, ID As String, LastRow As Integer, j As Long
Dim html As HTMLDocument, list As Object, i As Long
Dim xmlhttp As Object
Set xmlhttp = CreateObject("MSXML2.XMLHTTP.6.0")
'CreateObject("WINHTTP.WinHTTPRequest.5.1")
Worksheets("TEST").Activate
LastRow = Range("C" & Rows.Count).End(xlUp).Row
For j = 2 To LastRow
With ActiveSheet
URL = Range("S" & j).Text 'URL = https://stackoverflow.com/
tag = Range("T" & j).Text 'TAG = getElementsByClassName '<--- Where I want to assign the selector type (i.e. getelementsbyclassname, getelementsbytagname, etc.)
ID = Range("U" & j).Text 'Element ID = "CONTENT"
End With
Set xmlhttp = New MSXML2.XMLHTTP60
Set html = New HTMLDocument
With xmlhttp
.Open "GET", URL, False
.setRequestHeader "User-Agent", "Chrome/39.0.2171.95"
.Send
html.body.innerHTML = .responseText
End With
'Set list = html.querySelectorAll("CONTENT") <---Example..
Set list = html.querySelectorAll(ID) '<---This WORKS as it's HARD-CODED
Set list = html.TAG(ID) '<---This DOESN'T WORK in trying to make it VARIABLE
For i = 0 To 5
With ActiveSheet
.Cells(j, 22 + i) = list.Item(i).innerText
'.Cells(j + 1, 22 + 1) = list.Item(i).getAttribute("href")
End With
Next
Next
End Sub
Sub-FETCHER()
Dim URL为字符串,tag为字符串,ID为字符串,LastRow为整数,j为长
将html变暗为HTMLDocument,将列表变为对象,i变长
Dim xmlhttp作为对象
设置xmlhttp=CreateObject(“MSXML2.xmlhttp.6.0”)
'CreateObject(“WINHTTP.WinHTTPRequest.5.1”)
工作表(“测试”)。激活
LastRow=范围(“C”和Rows.Count).End(xlUp).Row
对于j=2到最后一行
使用ActiveSheet
URL=范围(“S”&j)。文本的URL=https://stackoverflow.com/
tag=Range(“T”&j)。Text'tag=getElementsByClassName'我认为您试图通过字符串变量调用方法,在这种情况下,您需要CallByName,例如
Option Explicit
Public Sub test()
Dim xmlhttp As MSXML2.XMLHTTP60
Dim html As MSHTML.HTMLDocument
Set xmlhttp = New MSXML2.XMLHTTP60
Set html = New MSHTML.HTMLDocument
With xmlhttp
.Open "GET", "https://stackoverflow.com/", False
.setRequestHeader "User-Agent", "Chrome/39.0.2171.95"
.send
html.body.innerHTML = .responseText
End With
Dim tag As String, list As Object
tag = "GetElementsByTagName"
Set list = CallByName(html, tag, VbMethod, "a") '<==note the args at end e.g. here the element type selector of "a" for a tag elements.
Debug.Print list.Length
End Sub
选项显式
公共子测试()
Dim xmlhttp作为MSXML2.XMLHTTP60
将html设置为MSHTML.HTMLDocument
设置xmlhttp=New MSXML2.XMLHTTP60
Set html=New MSHTML.HTMLDocument
使用xmlhttp
.打开“获取”https://stackoverflow.com/”“错
.setRequestHeader“用户代理”、“Chrome/39.0.2171.95”
.发送
html.body.innerHTML=.responseText
以
Dim标记为字符串,列表为对象
tag=“GetElementsByTagName”
Set list=CallByName(html,tag,VbMethod,“a”)”我认为您试图通过字符串变量调用一个方法,在这种情况下,您需要CallByName,例如
Option Explicit
Public Sub test()
Dim xmlhttp As MSXML2.XMLHTTP60
Dim html As MSHTML.HTMLDocument
Set xmlhttp = New MSXML2.XMLHTTP60
Set html = New MSHTML.HTMLDocument
With xmlhttp
.Open "GET", "https://stackoverflow.com/", False
.setRequestHeader "User-Agent", "Chrome/39.0.2171.95"
.send
html.body.innerHTML = .responseText
End With
Dim tag As String, list As Object
tag = "GetElementsByTagName"
Set list = CallByName(html, tag, VbMethod, "a") '<==note the args at end e.g. here the element type selector of "a" for a tag elements.
Debug.Print list.Length
End Sub
选项显式
公共子测试()
Dim xmlhttp作为MSXML2.XMLHTTP60
将html设置为MSHTML.HTMLDocument
设置xmlhttp=New MSXML2.XMLHTTP60
Set html=New MSHTML.HTMLDocument
使用xmlhttp
.打开“获取”https://stackoverflow.com/”“错
.setRequestHeader“用户代理”、“Chrome/39.0.2171.95”
.发送
html.body.innerHTML=.responseText
以
Dim标记为字符串,列表为对象
tag=“GetElementsByTagName”
Set list=CallByName(html、tag、VbMethod、“a”)需要一些示例来说明s、T、U列单元格中的内容。你不能这样做html.TAG(ID)
,但如果不知道标签中的内容,就很难提出建议。嘿,我已经更新了帖子,添加了一个示例,说明循环中的一行是什么样子。标记表示“HTML DOM querySelector()”需要一些s、T、U列单元格中内容的示例。你不能这样做html.TAG(ID)
,但如果不知道标签中的内容,就很难提出建议。嘿,我已经更新了帖子,添加了一个示例,说明循环中的一行是什么样子。标记表示“HTML DOM querySelector()”,我认为您的思路是正确的:)也就是说,既然我不能单独声明“HTML”并放入“HTML”,您将如何编写它。抛出一个错误…?为您更新。试一试。我一直在玩更新的公式,它不断崩溃excel/vba(即没有响应)。。。我唯一的解决办法是使用IF/ELSE IF语句,然后运行相应的“set list”。请在pastebin.com上创建导致崩溃的整个代码的链接。我上面的代码运行得很好。嗨,你想粘贴链接吗?我想你是在正确的轨道上:)也就是说,既然我不能单独声明“html”并放入“html”,你将如何编写它。抛出一个错误…?为你更新。试一试。我一直在玩更新的公式,它不断崩溃excel/vba(即没有响应)。。。我唯一的解决办法是使用IF/ELSE IF语句,然后运行相应的“set list”。请在pastebin.com上创建导致崩溃的整个代码的链接。我上面的代码运行正常。嗨,你想粘贴链接吗?