我正在尝试从一组相似的网页中提取一个唯一的号码。它们都很相似,但是我正在使用的当前代码使用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文本中简单地工作要复杂得多,而且速度也较慢。
这是表中的最后一个子项,因此您可以链接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