C# 如何获取<;中的所有内容;td>;使用HTML敏捷包标记?

C# 如何获取<;中的所有内容;td>;使用HTML敏捷包标记?,c#,screen-scraping,html-agility-pack,C#,Screen Scraping,Html Agility Pack,因此,我正在编写一个应用程序,将做一些屏幕抓取。我使用将整个HTML页面加载到名为doc的htmldocument实例中。现在我想解析该文档,查找以下内容: <table border="0" cellspacing="3"> <tr><td>First rows stuff</td></tr> <tr> <td> The data I want is in here <br /> and it'

因此,我正在编写一个应用程序,将做一些屏幕抓取。我使用将整个HTML页面加载到名为
doc
htmldocument
实例中。现在我想解析该文档,查找以下内容:

<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> 

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

最好的答案是“其他东西”——HTML最好由HTML解析器解析,而不是通过正则表达式。我不是C#专家,但我听说它在这方面很受欢迎。

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

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

如果您已经在使用Agility pack,那么只需使用一些东西
doc.DocumentNode.SelectNodes(“//table[@cellspacking='3']”)即可获取文档中的表。尝试浏览文档和编码示例。既然您已经有了结构化数据,那么返回文本数据并重新分析是非常明智的。

通常我也会同意这一点,但我认为这是一个例外,因为我正在寻找的内容非常狭窄。不过,如果你能提出其他建议,我也愿意接受。你的文件中只有一个表格吗?如果没有,您将如何定位您感兴趣的表?@Mark:基于
cellspacting=“3”
属性。我理解这听起来有点骇人听闻(这是因为它是),但在1000多个文档中,没有任何其他表包含cellspacing属性。这不是生产代码,只是一个收集数据的项目。你的标题和问题不一致。标题:
如何获取标签中的所有内容
问题:
所以我只需要获取第二行中的数据。
哪一行?你能修正它使标题和问题匹配吗?我认为你的方法是正确的,但我没有看到intellisense中的
.Single()
方法。我正在使用HTML敏捷包的1.4.0版@鲍勃·迪伦:这段代码只是一个例子。如果没有可用的
Single()
,您不必使用它,只需编写
。选择节点(…)[0]
。虽然了解Linq对C#的开发来说是一笔巨大的财富。@Mark:好的,我刚才试着像你说的那样使用
[0]
,但遇到了一个例外:
节点
:“对象引用未设置为对象的实例”。我想这意味着它没有找到桌子、tr或td?@Bob Dylan:正确。您可以将XPath表达式更改为“//table[@cellspacing=3]”,然后查看是否匹配。
HtmlDocument doc = new HtmlDocument();
doc.Load("input.html");
HtmlNode node = doc.DocumentNode
                   .SelectNodes("//table[@cellspacing='3']/tr[2]/td")
                   .Single();
string text = node.InnerText;