【问题标题】:Retrieve multiple `td` values with the same `Class` name using HTMLAgilityPack Library .NET使用 HTMLAgilityPack 库 .NET 检索具有相同“类”名称的多个“td”值
【发布时间】: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

我真的很困惑为什么它只返回第一个数字值。数值与&lt;div class="name"&gt; 不对应。

在我的理解中,对于它执行的每个循环,它都会在每个&lt;tbody class="person"&gt; 下获取相应的数据。如何获得与&lt;div class="name"&gt; 对应的下一个数值。非常感谢。

【问题讨论】:

  • 我会说那是丑陋的 HTML,不确定你对它有多少控制权。 div 不应该是 tbody 的直接子代,td 也不应该是 tr 的子代。哦,我开玩笑地注意到完全没有table 标签。
  • @Jon P,这不是我将要使用的真正的 html 代码。是的,它很丑,但它仍然是有效的 html。我只是快速创建了这个来缩短实验代码。然而,这是我将要抓取的原始专业网站 html 的格式。我只是按照格式。感谢您的评论。

标签: html .net winforms html-agility-pack


【解决方案1】:

这是错误:

'select the first <tbody class="person"> element'
Dim numberNode = tbody.SelectSingleNode("//tbody[contains(@class, 'person')]")
'then get all <td class='num'> within above <tbody>'
Dim valueNode = numberNode.SelectNodes(".//td[contains(@class, 'num')]")

尝试将其更改为如下:

'get all <td class='num'> within <tbody> of current iteration'
Dim valueNode = tbody.SelectNodes(".//td[contains(@class, 'num')]")

【讨论】:

  • 天哪,它有效!现在我明白了。非常非常感谢你。我很感激。赞成并标记您的答案:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-16
  • 1970-01-01
  • 2012-05-12
  • 1970-01-01
  • 2011-06-01
  • 2015-02-10
  • 2011-06-13
相关资源
最近更新 更多