1

我编写了以下代码,以便从 API 检索数据并希望获得特定元素的内容。我编写了适用于网页(不是 API)的类似代码,但在此示例中它会中断并且不明白为什么。

Sub parseXML()
Dim xmldoc As Object
Dim obj As Object
Dim MyRequest As Object

Set MyRequest = CreateObject("MSXML2.XMLHTTP")
MyRequest.Open "GET", 
"https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi? db=pubmed&term=ABL1%20Acute%20granulocytic%20leukemia"     
 MyRequest.send
 While Not MyRequest.readyState = 4
       DoEvents
    Wend
Set xmldoc = MyRequest.responseXML
Set obj = xmldoc.DocumentElement.getElementsByClassName("ui-ncbihistogram-display-area")(0) 'Error: object doesn't support this property or method 
End Sub 

我应该如何写最后一行以消除错误?我正在尝试获取元素class="ui-ncbihistogram-display-area"。它有几个<li>元素,最后我想检索每个<li>元素的内部文本。

4

1 回答 1

2

您正在尝试使用适用于 HTML 解析器的语法来选择相同术语的 pubmed 搜索,即您将选择页面上的直方图。

但是,通过 API 调用,您将获得一个 XML 文档,该文档将根据 API 文档指定字段。相反,如果使用 xml 解析器,您将使用 xpath 来指定您想要的内容(这将允许您在属性和父子关系方面包含更多特异性)。如果您要使用 HTML 解析器,那么您需要查看按标签选择。对于直方图,网页中存在的字段在响应中不存在。返回的 xml 文档中也不存在该信息。匹配的数字是您获得查询的总结果数,即 248。虽然它在网页直方图中按年份细分,而在 XML API 响应中是总数。

样品比较:

在此处输入图像描述

我建议对 XML 使用 XML 解析器。然后,您有望获得预期的结果。比较这里的两个解析器,其中 HTMLDocument 中有内容丢失。

Public Sub DifferentParsing()
    Dim xmlDoc As Object, htmlDoc As HTMLDocument, url As String

    Set xmlDoc = CreateObject("MSXML2.DOMDocument") 'New MSXML2.DOMDocument60
    Set htmlDoc = New HTMLDocument
    url = "https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi?%20db=pubmed&term=ABL1%20Acute%20granulocytic%20leukemia"

    With CreateObject("MSXML2.XMLHTTP")
        .Open "GET", url, False
        .send
        htmlDoc.body.innerHTML = .responseText
        xmlDoc.LoadXML .responseXML.XML
    End With
    Debug.Print xmlDoc.SelectSingleNode("//Count").Text
    Debug.Print htmlDoc.getElementsByTagName("Count")(0).innerText
End Sub
于 2019-07-21T12:27:48.930 回答