【发布时间】:2016-12-23 06:42:48
【问题描述】:
我正在尝试编写筛选此 DOM 结构的代码:
<html>
<head>
<body>
<table id="the-table" border="1">
<thead>
<tbody>
<tr> </tr>
<tr>
<td class="x-grid3-hd-inner" bgcolor="#8dd5e7" colspan="7">
</tr>
<tr>
<td class="x-grid3-hd-inner" bgcolor="#8dd5e7" colspan="7">
</tr>
<tr>
<tr>
<td class="oneline">2</td>
<td class="oneline">ENB</td>
<td class="oneline">2</td>
<td class="oneline">CELL_99</td>
<td class="oneline">255.255.255.0</td>
<td class="oneline">My Group</td>
<td class="oneline">*</td>
</tr>
<tr>
<tr>
<tr>
...
<tr>
<tr>
</tbody>
</table>
</body>
</html>
我正在尝试为表的所有 tr 元素提取每个 td 元素处的文本。我在上面扩展了一个例子。表格的所有 td 元素都使用相同的 html 结构进行格式化(除了表格的标题)。这是我迄今为止使用的方法。
Sub ParseWebPage(url As String, sheet As String, searchCrit As String)
Dim objXML As MSXML2.DOMDocument
Set objXML = New MSXML2.DOMDocument
Set htm = CreateObject("htmlFile")
With CreateObject("msxml2.xmlhttp")
.Open "GET", url, False
.send
xmlresp = .responseText
End With
objXML.loadXML (xmlresp)
Dim objElem As MSXML2.IXMLDOMElement
Debug.Print xmlresp
objXML.loadXML (xmlresp)
Set objElem = objXML.selectSingleNode("tr")
Debug.Print "Found" & objElem.text
End Sub
问题是,每次我的 objElem 返回时都是空的。我也尝试使用 NodeList 而不是 IXMLDOMElement 但它总是返回空。
我认为问题出在字符串参数上。我尝试使用“tr”、“oneline”、“/html/body/table/tbody”,并为每个“/html/body/table/tbody/tr[x]/td[y]”创建一个循环,但是这些都没有效果。
有人可以帮我吗?
【问题讨论】:
-
您的一般做法是正确的。我认为问题在于格式不正确的 XML(来自网络的 HTML 通常是)。我看到很多
<tr>标签,但几乎没有</tr>结束标签。 MSXML 需要完美的 XML,所以空的应该是<tr/>。还要检查objXML和If objXML Is Nothing Then ...- 因为您没有捕获 XML 解析错误。如果它是 Nothing - 则解析时出错。查看本指南以了解如何正确操作A Beginner's Guide to the XML DOM -
@LoganReed 该网站已经完全形成并且可以运行并且包含所有结束标签,这可能是发生了复制错误。我会看看这个链接,看看是否有帮助。
-
先尝试一个非常小的格式良好的 XML 示例,然后继续扩展它,直到找到错误为止。
-
@LoganReed - 因为我试图用 XML 函数解析 HTML,所以我不是走错方向了吗? stackoverflow.com/questions/2515097/…
-
嗯,这取决于。如果你正在编写一个一般的网络爬虫,它会遇到大部分糟糕的 HTML,那么是的——这是一个错误的方法。在那种情况下,我可能会尝试使用和操作 IE 对象(因为 HTML 解析将由浏览器完成)。如果您正在从一个网站读取 HTML 并且它的格式正确或不正确,但您可以将其修复为格式正确 - 那么 XML 解析器是您的最佳选择,因为它更容易和更快。