将 getElementsByClassName 与 VBA 结合使用
Using getElementsByClassName with VBA
我编写了以下代码以从 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>
元素的内部文本。
您正在尝试使用适用于 HTML 解析器的语法,从 pubmed 搜索中选择相同的术语,即您将选择 this 页面上的直方图。
但是,通过 API 调用,您将获得一个 XML 文档,该文档将根据 API 文档指定字段。相反,如果使用 xml 解析器,您将使用 xpath 来指定您想要的内容(这将允许您在属性和父子关系方面包含更多特异性)。如果您打算使用 HTML 解析器,那么您需要查看按标签选择。对于直方图,网页中存在的字段在响应中不存在。 return 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
我编写了以下代码以从 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>
元素的内部文本。
您正在尝试使用适用于 HTML 解析器的语法,从 pubmed 搜索中选择相同的术语,即您将选择 this 页面上的直方图。
但是,通过 API 调用,您将获得一个 XML 文档,该文档将根据 API 文档指定字段。相反,如果使用 xml 解析器,您将使用 xpath 来指定您想要的内容(这将允许您在属性和父子关系方面包含更多特异性)。如果您打算使用 HTML 解析器,那么您需要查看按标签选择。对于直方图,网页中存在的字段在响应中不存在。 return 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