【发布时间】:2014-05-26 06:44:31
【问题描述】:
我刚要再次使用 HTMLAgilityPack,但我真的不知道为什么我的代码会以这种方式执行。所以我有这个 HTML 代码。这只是一个实验性的 HTML 代码,以便于实验。
<html>
<tbody class="person">
<div class="name">Chris</div>
<td class="num">3,200</td>
<td class="num">62,000</td>
<td class="num">59,700</td>
<td class="num">1,500</td>
</tbody>
<tbody class="person">
<div class="name">John</div>
<td class="num">23,200</td>
<td class="num">900</td>
<td class="num">60,100</td>
<td class="num">1,300</td>
</tbody>
<tbody class="person">
<div class="name">James</div>
<td class="num">900</td>
<td class="num">60</td>
<td class="num">61,400</td>
<td class="num">610</td>
</tbody>
</html>
我目前的代码是这样的......
Dim web As New HtmlAgilityPack.HtmlWeb
Dim doc As HtmlAgilityPack.HtmlDocument = web.Load("C:/sample.html")
For Each tbody As HtmlNode In doc.DocumentNode.SelectNodes("//tbody[contains(@class, 'person')]")
Dim numberNode = tbody.SelectSingleNode("//tbody[contains(@class, 'person')]")
Dim valueNode = numberNode.SelectNodes(".//td[contains(@class, 'num')]")
Dim numbers As String()
numbers = (From n In valueNode Select n.InnerText).ToArray()
Dim nameNode As HtmlNode = tbody.SelectSingleNode(".//div[contains(@class, 'name')]")
If nameNode IsNot Nothing Then
MsgBox(numbers(0) & " " & numbers(1) & " " & numbers(2) & " " & numbers(3) & " - " & nameNode.InnerText, MsgBoxStyle.OkOnly, "System Message")
End If
Next
我真的很困惑为什么它只返回第一个数字值。数值与<div class="name"> 不对应。
在我的理解中,对于它执行的每个循环,它都会在每个<tbody class="person"> 下获取相应的数据。如何获得与<div class="name"> 对应的下一个数值。非常感谢。
【问题讨论】:
-
我会说那是丑陋的 HTML,不确定你对它有多少控制权。
div不应该是tbody的直接子代,td也不应该是tr的子代。哦,我开玩笑地注意到完全没有table标签。 -
@Jon P,这不是我将要使用的真正的 html 代码。是的,它很丑,但它仍然是有效的 html。我只是快速创建了这个来缩短实验代码。然而,这是我将要抓取的原始专业网站 html 的格式。我只是按照格式。感谢您的评论。
标签: html .net winforms html-agility-pack