【问题标题】:Getting specific data from html从 html 获取特定数据
【发布时间】:2014-01-19 07:20:36
【问题描述】:

我想从 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
{ }

错误:

“HtmlAgilityPack.HtmlNode”不包含“SelectNodes”的定义,并且找不到接受“HtmlAgilityPack.HtmlNode”类型的第一个参数的扩展方法“SelectNodes”(您是否缺少 using 指令或程序集引用? )

【问题讨论】:

    标签: c# html


    【解决方案1】:

    您可以尝试使用 XPath 查询语法来选择具有class='verse' 的所有&lt;p&gt;,如下所示:

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

    然后执行与您已有的相同的foreach

    更新一:

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

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

    这个解决方案比较长,因为我们需要在检查属性值之前检查节点是否具有类属性。否则,如果有没有类属性的&lt;p&gt;,我们将得到Null Reference Exception

    【讨论】:

    • 有一个错误'HtmlAgilityPack.HtmlNode'不包含'SelectNodes'的定义并且没有扩展方法'SelectNodes'接受'HtmlAgilityPack.HtmlNode'类型的第一个参数(你是缺少 using 指令或程序集引用?)
    • SelectNodes 的参数应该是你在我的回答中看到的字符串,而不是HtmlNode。你是如何应用这个解决方案的?如果您找不到解决方法,请尝试发布触发错误的代码
    • StringBuilder pureText = new StringBuilder(); HtmlDocument 文档 = 新 HtmlDocument(); doc.LoadHtml(URL); var s = doc.DocumentNode.SelectNodes("//p[@class='verse']"); // 错误尝试 { foreach (HtmlNode childNode in s) { pureText.Append(childNode.InnerText); } } 捕捉 { }
    • 您正在开发 WinRT 应用程序吗?如果是,this post 可能与您遇到的错误有关。 WinRT 不支持 XPath。
    • 是的,我正在使用 WinRT。所以 SelectNodes 不起作用。如何从 html 中获取数据?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-07
    • 2011-07-22
    • 2019-07-03
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    相关资源
    最近更新 更多