Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
获得;href=link";从html页面,并使用vba导航到该链接_Html_Excel_Vba_Internet Explorer_Web Scraping - Fatal编程技术网

获得;href=link";从html页面,并使用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

我正在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 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