Xml 将getElementsByClassName与VBA一起使用

Xml 将getElementsByClassName与VBA一起使用,xml,vba,web-scraping,xmlhttprequest,msxml2,Xml,Vba,Web Scraping,Xmlhttprequest,Msxml2,我编写以下代码是为了从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.

我编写以下代码是为了从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-ncbi直方图显示区域”
。它有几个
  • 元素,最后我想检索每个
  • 元素的内部文本。

    您正在尝试使用HTML解析器对相同术语的pubmed搜索进行选择的语法,也就是说,您将选择页面上的直方图

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

    样本比较:

    我建议对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
    

    您希望从该文档中获取哪些数据?什么具体元素?用于编辑/更新问题,并添加有关希望从文档中获取的数据/元素的确切信息。对于此行
    Debug.Print htmlDoc.getElementsByTagName(“Count”)(0)。innerText
    不返回前一行的248。我怀疑那个伯爵是个骗子tag@YasserKhalil嗨,看看我的答案。加载到Htmldocument中的响应是部分响应。开头被剥去了,实际上没有开头的标签。如果打印html.body.innerhtml,您将看到。这就是我关于在这个例子中使用xml解析器的观点。感谢@QHarr提供详细的答案。虽然我没有达到我的目标,但您明确表示API返回的结果与我假设的完全不同,因此至少现在这个错误是有意义的。如果我想返回我正在寻找的数据,我首先需要修改API搜索。