具有唯一的前置文本,但网页中没有唯一的类或标记的纯文本

问题描述 投票:1回答:1

我正在尝试从一组相似的网页中提取一个唯一的号码。它们都很相似,但是我正在使用的当前代码使用MSXML2.XMLHTTP并标识给定类或标记中​​的文本。

问题是这些网页略有不同,因此代码无法根据项目条件可靠地从所有网页中提取。而且,页面上有许多相同的类和标记,因此没有唯一可识别的东西。

但是,有一段唯一的文本(“ ISIN代码:”),然后在下一行中跟随我想要的ISIN编号。我听说过Ids进行解析,但是找不到/不知道这种方法是如何工作的。

我要提取的信息是“ GB00B6Y7NF43”:

<tr>
    <th class="align-left">ISIN code:</th>
    <td> GB00B6Y7NF43 </td>
</tr>

这是我现在使用Item(...)方法在页面上查找其他信息的大部分代码。我不知道我的代码本身是否正确,但是到目前为止,如果您通过Item(0)或Item(1)等指定,它可以正确提取信息。

Dim request As Object
Dim response As String
Dim html As New HTMLDocument
Dim td As Object
Dim website As String
Dim charge As Variant

With Worksheets("Sheet1")

website = Range("A14").Value

End With

Set request = CreateObject("MSXML2.XMLHTTP")

request.Open "GET", website, False

request.send

response = StrConv(request.responseBody, vbUnicode)

html.body.innerHTML = response

Worksheets("Information").Activate

        r = r + 2:
        Cells(r, 3) = html.getElementsByClassName("header-row").Item(0).innerText
        Cells(r, 5) = html.getElementsByTagName("td").Item(0).innerText
        Cells(r, 4) = html.getElementsByClassName("icon-link pdf-icon").Item(1).href

我的代码是否还有另一种方法/编码风格/调整过?

我可以使用dimie / appIe和类似的方法,但是到目前为止,在PC上这些方法比在HTML文本中简单地工作要复杂得多,而且速度也较慢。

html vba parsing dom xml-parsing
1个回答
0
投票

这是表中的最后一个子项,因此您可以链接lastchild呼叫

html.querySelector("[summary='More fund information']").children(0).lastchild.lastchild.innertext

所以

Option Explicit
Public Sub test()
    Dim html As HTMLDocument

    Set html = New HTMLDocument

    With CreateObject("MSXML2.XMLHTTP")
        .Open "GET", "https://www.hl.co.uk/funds/fund-discounts,-prices--and--factsheets/search-results/f/fidelity-asia-class-w-accumulation/key-features", False
        .send
        html.body.innerHTML = .responseText
    End With
    Debug.Print html.querySelector("[summary='More fund information'] ").Children(0).LastChild.LastChild.innerText
End Sub

一种较慢但随时间推移可能更可靠的方法可能是收集表头并找到带有所需ISIN文本的表头,然后采用NextSibling(td)节点。

Option Explicit
Public Sub test()
    Dim html As HTMLDocument

    Set html = New HTMLDocument

    With CreateObject("MSXML2.XMLHTTP")
        .Open "GET", "https://www.hl.co.uk/funds/fund-discounts,-prices--and--factsheets/search-results/f/fidelity-asia-class-w-accumulation/key-features", False
        .send
        html.body.innerHTML = .responseText
    End With

    Dim i As Long, nodes As Object

    Set nodes = html.querySelectorAll("[summary='More fund information'] th")
    For i = 0 To nodes.Length - 1
        If nodes.Item(i).innerText = "ISIN code:" Then
            Debug.Print nodes.Item(i).NextSibling.innerText
            Exit For
        End If
    Next
End Sub
© www.soinside.com 2019 - 2024. All rights reserved.