从html页面获取“ href = link”并使用vba导航到该链接

时间:2018-07-25 01:20:24

标签: 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 checked without js</a>

我得到的结果是,我能够得到包含标签的类值How to make the word invisible when it's checked without js <----这就是我在工作表中得到的标题。我想要得到的是此标题拥有一个href链接/questions/51509457/how-to-make-the-word-invisible-when-its-checked-without-js,这就是我想要得到的并浏览我的代码。

请帮帮我。预先感谢

下面是整个编码:

Sub useClassnames()
    Dim element As IHTMLElement
    Dim elements As IHTMLElementCollection
    Dim ie As InternetExplorer
    Dim html As HTMLDocument

    'open Internet Explorer in memory, and go to website
    Set ie = New InternetExplorer
    ie.Visible = True
    ie.navigate "https://stackoverflow.com/questions"
    'Wait until IE has loaded the web page

    Do While ie.readyState <> READYSTATE_COMPLETE
        DoEvents
    Loop

    Set html = ie.document
    Set elements = html.getElementsByClassName("question-hyperlink")

    Dim count As Long
    Dim erow As Long
    count = 0

    For Each element In elements
        If element.className = "question-hyperlink" Then
            erow = Sheets("Exec").Cells(Rows.count, 1).End(xlUp).Offset(1, 0).Row
            Sheets("Exec").Cells(erow, 1) = html.getElementsByClassName("question-hyperlink")(count).innerText
            count = count + 1
        End If
    Next element

    Range("H10").Select
End Sub

我在这个网站上找不到任何人问的任何答案。请不要重复提出这个问题。

<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%'

2 个答案:

答案 0 :(得分:1)

方法①

使用XHR通过问题首页URL发出初始请求;应用CSS选择器检索链接,然后将那些链接传递到IE导航到


用于选择元素的CSS选择器:

您想要元素的href属性。已经给出了一个示例。您可以使用getAttribute,或者如@Santosh所指出的,将href属性CSS选择器与其他CSS选择器结合起来以定位元素。

CSS选择器:

a.question-hyperlink[href]

寻找具有父类a标签,元素为question-hyperlink和属性href的元素。

然后,将CSS选择器组合与querySelectorAll的{​​{1}}方法一起应用以收集链接的nodeList。


XHR以获取链接的初始列表:

我会先以XHR的形式发布此文件,速度更快,然后将链接收集到collection / nodeList中,然后再使用IE浏览器循环。

document

上面的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 中是一个nodeList,其中包含主页中所有匹配的元素,即问题登录页面上的所有linkList。您可以循环href的{​​{1}}并对其进行索引以检索特定的.Length,例如linkList.item(i)。由于返回的链接是相对的,因此您需要使用协议+域(即nodeList)替换路径的相对href部分。

现在您已经快速获得该列表并可以访问项目,您可以将任何给定的更新后的about:传递到"https://stackoverflow.com"上。


使用IE和nodeList导航问题

href

方法②

使用XHR通过GET请求发出初始请求并搜索问题标题;应用CSS选择器检索链接,然后将那些链接传递到IE进行导航。


IE.Navigate

答案 1 :(得分:0)

  1. protected String getMyData(String param){ HashMap<String, String> params = new HashMap<>(); params.put("param1", apicall); params.put("param2", param); MyAsyncClass myAsyncClass = new MyAsyncClass(params); myData= myAsyncClass.execute().get(); /* Here after finishing the task I want to return the data to the caller */ return myData; } 是无用的,因为它总是真实的,因为您StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); env.enableCheckpointing(5000); ,因此所有元素都绝对属于If element.className = "question-hyperlink" Then类。 getElementsByClassName("question-hyperlink")语句可以删除。

  2. 您在变量question-hyperlink中拥有每个链接,因此不需要If。代替element,请使用count

所以它应该像这样:

html.getElementsByClassName("question-hyperlink")(count).innerText