从html获取特定数据

时间:2014-01-19 07:20:37

标签: c# html

我想从html获取特定数据。我使用c#和HtmlAgilityPack

以下是HTML示例:

<p class="heading"><span>Greeting!</span>

<p class='verse'>Hi!<br>               //
Hello!</p><p class='verse'>Hello!<br>  // i want to get this g
Hi!</p>                                //

<p class="writers"><strong>WE</strong><br/>

这是我在c#中的代码:

StringBuilder pureText = new StringBuilder();
HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(Lyrics);

var s = doc.DocumentNode.Descendants("p");

try
{
     foreach (HtmlNode childNode in s)
     {
                        pureText.Append(childNode.InnerText);
     }
}
catch
{ }

更新:

StringBuilder pureText = new StringBuilder();
HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(URL);

var s = doc.DocumentNode.SelectNodes("//p[@class='verse']"); // error

try
{
     foreach (HtmlNode childNode in s)
     {
            pureText.Append(childNode.InnerText);
     }
}
catch
{ }

ERROR:

'HtmlAgilityPack.HtmlNode'不包含'SelectNodes'的定义,并且没有扩展方法'SelectNodes'接受类型为'HtmlAgilityPack.HtmlNode'的第一个参数'(您是否缺少using指令或汇编引用? )

1 个答案:

答案 0 :(得分:4)

您可以尝试使用XPath查询语法选择所有<p> class='verse',如下所示:

var s = doc.DocumentNode.SelectNodes("//p[@class='verse']");

然后按照您现有的foreach进行操作。

更新I:

我不知道为什么上面的代码会为你抛出错误。它已在我的电脑上测试过,应该可以正常工作。无论如何,如果您接受解决方法,可以通过这种方式实现相同的查询:

var s = doc.DocumentNode.Descendants("p").Where(o => o.Attributes["class"] != null && o.Attributes["class"].Value == "verse");

此解决方案更长,因为我们需要在检查属性值之前检查节点是否具有类属性。否则,如果有Null Reference Exception没有类属性,我们将获得<p>