【问题标题】:How can I get all content within <td> tag using a HTML Agility Pack?如何使用 HTML Agility Pack 获取 <td> 标记中的所有内容?
【发布时间】:2010-06-12 05:26:19
【问题描述】:

所以我正在编写一个应用程序来进行一点屏幕抓取。我正在使用HTML Agility Pack 将整个HTML 页面加载到一个名为docHtmlDocoument 实例中。现在我想解析那个文档,寻找这个:

<table border="0" cellspacing="3">
<tr><td>First rows stuff</td></tr>
<tr>
<td> 
The data I want is in here <br /> 
and it's seperated by these annoying <br /> 's.

No id's, classes, or even a single <p> tag. </p> Just a bunch of <br />  tags.
</td> 
</tr> 
</table> 

所以我只需要获取第二行中的数据。我怎样才能做到这一点?我应该使用正则表达式还是其他东西?

更新:这是我如何加载我的doc

HtmlWeb hw = new HtmlWeb();
HtmlDocument doc = hw.Load(Url);

【问题讨论】:

  • 您的文档中是否只有一个表格?如果没有,您将如何找到您感兴趣的表格?
  • @Mark:基于cellspacing="3" 属性。我知道这听起来 hacky (因为它是),但 1000 多个文档中没有其他表包含 cellspacing 属性。这不是生产代码,只是我正在运行以收集一些数据的项目。
  • 您的标题和问题不一致。标题:How can I get all content within &lt;table&gt;&lt;/table&gt; tags 问题:So I just need to get the data within the 2nd row. 这是哪个?你能修复它以使标题和问题匹配吗?

标签: c# screen-scraping html-agility-pack


【解决方案1】:

既然您已经在使用Html Agility Pack,我建议您使用它提供的方法来查找您想要的信息。有几种方法可以导航文档,但最简洁的方法之一是使用 XPath。在这种情况下,您可以使用以下内容:

HtmlDocument doc = new HtmlDocument();
doc.Load("input.html");
HtmlNode node = doc.DocumentNode
                   .SelectNodes("//table[@cellspacing='3']/tr[2]/td")
                   .Single();
string text = node.InnerText;

【讨论】:

  • 我认为你在正确的轨道上,但我没有在智能感知中看到 .Single() 方法。我正在使用 HTML Agility Pack 的 1.4.0 版。
  • 添加引用并使用 System.Data.Linq;
  • @Bob Dylan:该代码只是一个示例。如果您没有可用的Single(),则您没有必须 使用它——您可以改写.SelectNodes(...)[0]。尽管了解 Linq 对于使用 C# 进行开发来说是一笔巨大的财富。
  • @Mark:好的,我刚刚尝试使用[0],就像你说的那样,但遇到了一个异常:node:“对象引用未设置为对象的实例”。我认为这意味着它没有找到表、tr 或 td?
  • @Bob Dylan:正确。您可以将 XPath 表达式更改为 "//table[@cellspacing=3]" 并查看是否匹配。
【解决方案2】:

"Something else" 是最好的答案——HTML 最好由 HTML 解析器而不是通过正则表达式来解析。我不是 C# 专家,但我听说 HTML Agility Pack 很受欢迎。

【讨论】:

    【解决方案3】:

    【讨论】:

    • 通常我也会同意这一点,但我认为这是一个例外,因为我正在寻找如此狭窄的东西。但是,如果您可以真正提出其他建议,我也会对此持开放态度。
    【解决方案4】:

    使用 xml 解析器可能会获得更好的结果。

    【讨论】:

      【解决方案5】:

      如果您已经在使用 Agility 包,那么只需使用 doc.DocumentNode.SelectNodes("//table[@cellspacing='3']") 获取文档中的表格即可。尝试查看文档和编码示例。由于您已经拥有结构化数据,因此返回文本数据并重新解析是很可笑的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-10
        • 2017-04-13
        • 1970-01-01
        • 2011-10-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多