获得;href=link";从html页面,并使用vba导航到该链接
我正在Excel VBA中编写代码,以获取类的获得;href=link";从html页面,并使用vba导航到该链接,html,excel,vba,internet-explorer,web-scraping,Html,Excel,Vba,Internet Explorer,Web Scraping,我正在Excel VBA中编写代码,以获取类的href值并导航到该href链接 (即)这是我想进入特定Excel工作表的href值,我想通过VBA代码自动导航到该链接 <a href="/questions/51509457/how-to-make-the-word-invisible-when-its-checked-without-js" class="question-hyperlink">How to make the word invisible when it's che
href
值并导航到该href链接
(即)这是我想进入特定Excel工作表的href
值,我想通过VBA代码自动导航到该链接
<a href="/questions/51509457/how-to-make-the-word-invisible-when-its-checked-without-js" class="question-hyperlink">How to make the word invisible when it's checked without js</a>
我在这个网站上找不到任何人问的答案。请不要建议这个问题重复
<div class="row hoverSensitive">
<div class="column summary-column summary-column-icon-compact ">
<img src="images/app/run32.png" alt="" width="32" height="32">
</div>
<div class="column summary-column ">
<div class="summary-title summary-title-compact text-ppp">
<a href="**index.php?/runs/view/7552**">MMDA</a>
</div>
<div class="summary-description-compact text-secondary text-ppp">
By on 7/9/2018 </div>
</div>
<div class="column summary-column summary-column-bar ">
<div class="table">
<div class="column">
<div class="chart-bar ">
<div class="chart-bar-custom link-tooltip" tooltip-position="left" style="background: #4dba0f; width: 125px" tooltip-text="100% Passed (11/11 tests)"></div>
</div>
</div>
<div class="column chart-bar-percent chart-bar-percent-compact">
100%'
截止日期:2018年7月9日
100%'
如果element.className=“question hyperlink”那么
是无用的,因为它总是正确的,因为您getElementsByClassName(“question hyperlink”)
所以所有元素都肯定属于类question hyperlink
。可以删除If
语句元素中有每个链接
,因此不需要计数
。不要使用html.getElementsByClassName(“问题超链接”)(count).innerText
使用element.innerText
Set elements = html.getElementsByClassName("question-hyperlink")
Dim erow As Long
For Each element In elements
erow = Worksheets("Exec").Cells(Rows.count, 1).End(xlUp).Offset(1, 0).Row
Worksheets("Exec").Cells(erow, 1) = element.innerText
Worksheets("Exec").Cells(erow, 2) = element.GetAttribute("href") 'this should give you the URL
Next element
方法①
使用XHR使用问题主页URL发出初始请求;应用CSS选择器检索链接,然后将这些链接传递给IE以导航到
用于选择元素的CSS选择器: 您需要元素的
href
属性。已经为您提供了一个示例。您可以使用getAttribute,或者如@Santosh所指出的,将href
属性CSS选择器与其他CSS选择器结合起来,以元素为目标
CSS选择器:
a.question-hyperlink[href]
查找具有父级a
标记且具有类问题超链接
和href
属性的元素
然后将CSS选择器与document
的querySelectorAll
方法相结合,以收集链接的节点列表
XHR获取链接的初始列表: 我会先以XHR的形式发布,速度也会更快,然后将链接收集到集合/节点列表中,您可以稍后使用IE浏览器循环
Option Explicit
Public Sub GetLinks()
Dim sResponse As String, HTML As New HTMLDocument, linkList As Object, i As Long
Const BASE_URL As String = "https://stackoverflow.com"
With CreateObject("MSXML2.XMLHTTP")
.Open "GET", "https://stackoverflow.com/questions", False
.send
sResponse = StrConv(.responseBody, vbUnicode)
End With
sResponse = Mid$(sResponse, InStr(1, sResponse, "<!DOCTYPE "))
With HTML
.body.innerHTML = sResponse
Set linkList = .querySelectorAll("a.question-hyperlink[href]")
For i = 0 To linkList.Length - 1
Debug.Print Replace$(linkList.item(i), "about:", BASE_URL)
Next i
End With
'Code using IE and linkList
End Sub
方法② 使用XHR通过GET请求发出初始请求,并搜索问题标题;应用CSS选择器检索链接,然后将这些链接传递给IE进行导航。
选项显式
公共子GetLinks()
Dim作为字符串响应,HTML作为新的HTMLDocument,linkList作为对象,i作为长
Const BASE_URL作为字符串=”https://stackoverflow.com"
Const TARGET_QUESTION As String=“在没有js的情况下检查单词时如何使其不可见”
使用CreateObject(“MSXML2.XMLHTTP”)
.打开“获取”https://stackoverflow.com/search?q=“&URLEncode(目标问题),False”
.发送
sResponse=StrConv(.responseBody,vbUnicode)
以
sResponse=Mid$(sResponse,InStr(1,sResponse),“看起来你有内部文本,你需要getAttribute(“href”)如果我这样做了,我不会得到空白单元格,还有其他方法吗?@JeremyKahan有其他方法吗?有人能解释一下下面的代码吗:为了避免.getAttribute(“href”)
在for循环中使用.queryselectoral(”a、 问题hyperlink[href]”
实际上,一旦更改,可以使用Debug.Print linkList(i)
访问该值是否回答了您的问题@MDI?
Option Explicit
Public Sub GetLinks()
Dim sResponse As String, HTML As New HTMLDocument, linkList As Object, i As Long
Const BASE_URL As String = "https://stackoverflow.com"
With CreateObject("MSXML2.XMLHTTP")
.Open "GET", "https://stackoverflow.com/questions", False
.send
sResponse = StrConv(.responseBody, vbUnicode)
End With
sResponse = Mid$(sResponse, InStr(1, sResponse, "<!DOCTYPE "))
With HTML
.body.innerHTML = sResponse
Set linkList = .querySelectorAll("a.question-hyperlink[href]")
For i = 0 To linkList.Length - 1
Debug.Print Replace$(linkList.item(i), "about:", BASE_URL)
Next i
End With
'Code using IE and linkList
End Sub
For i = 0 To linkList.Length - 1
IE.Navigate Replace$(linkList.item(i).getAttribute("href"), "about:", BASE_URL)
Next i
Option Explicit
Public Sub GetLinks()
Dim sResponse As String, HTML As New HTMLDocument, linkList As Object, i As Long
Const BASE_URL As String = "https://stackoverflow.com"
Const TARGET_QUESTION As String = "How to make the word invisible when it's checked without js"
With CreateObject("MSXML2.XMLHTTP")
.Open "GET", "https://stackoverflow.com/search?q=" & URLEncode(TARGET_QUESTION), False
.send
sResponse = StrConv(.responseBody, vbUnicode)
End With
sResponse = Mid$(sResponse, InStr(1, sResponse, "<!DOCTYPE "))
With HTML
.body.innerHTML = sResponse
Set linkList = .querySelectorAll("a.question-hyperlink[href]")
For i = 0 To linkList.Length - 1
Debug.Print Replace$(linkList.item(i).getAttribute("href"), "about:", BASE_URL)
Next i
End With
If linkList Is Nothing Then Exit Sub
'Code using IE and linkList
End Sub
'https://stackoverflow.com/questions/218181/how-can-i-url-encode-a-string-in-excel-vba @Tomalak
Public Function URLEncode( _
StringVal As String, _
Optional SpaceAsPlus As Boolean = False _
) As String
Dim StringLen As Long: StringLen = Len(StringVal)
If StringLen > 0 Then
ReDim result(StringLen) As String
Dim i As Long, CharCode As Integer
Dim Char As String, Space As String
If SpaceAsPlus Then Space = "+" Else Space = "%20"
For i = 1 To StringLen
Char = Mid$(StringVal, i, 1)
CharCode = Asc(Char)
Select Case CharCode
Case 97 To 122, 65 To 90, 48 To 57, 45, 46, 95, 126
result(i) = Char
Case 32
result(i) = Space
Case 0 To 15
result(i) = "%0" & Hex(CharCode)
Case Else
result(i) = "%" & Hex(CharCode)
End Select
Next i
URLEncode = Join(result, "")
End If
End Function