我想从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指令或汇编引用? )
答案 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>
。