【问题标题】:Html Agility Pack c# Paragraph parsing problemhtml Agility Pack c# 段落解析问题
【发布时间】:2011-06-12 18:38:12
【问题描述】:

我的代码有几个问题,我试图从页面中提取每个段落,但目前它只选择最后一个段落。

这是我的代码。

foreach (HtmlNode node in doc.DocumentNode.SelectNodes("//div[@id='body']/p"))
{
  string text = node.InnerText;
  lblTest2.Text = text;
}

【问题讨论】:

    标签: c# html html-agility-pack


    【解决方案1】:

    IMO,XPath 不好玩。我建议改用 LINQ 语法:

    foreach (var node in doc.DocumentNode
        .DescendantNodes()
        .Single(x => x.Id == "body")
        .DescendantNodes()
        .Where(x => x.Name == "p")) 
    {
        string text = node.InnerText;
        lblTest2.Text = text;
    }
    

    【讨论】:

    • 我花了一段时间才弄明白。看看他在 in 循环中做了什么。
    【解决方案2】:

    在您的循环中,您将获取当前节点 innerText 并将其分配给标签。您对 每个 节点执行此操作,因此您当然只能看到最后一个节点 - 您不会保留以前的节点。

    试试这个:

    foreach (HtmlNode node in doc.DocumentNode.SelectNodes("//div[@id='body']/p"))
    {
      string text = node.InnerText;
      lblTest2.Text += text + Environment.NewLine;
    }
    

    【讨论】:

    • 这有改变吗? doc(假设这是来自像“HtmlDocument doc = new HtmlDocument();”这样的声明对我不起作用;具体来说,它没有“DocumentNode”成员......?这是一个全新的 HtmlAgilityPack 的 NuGet(版本1.4.6.0)
    • 谢谢;问题是“使用 HtmlDocument = System.Windows.Forms.HtmlDocument;”不知何故被添加到我的 using 子句中,并且正在使用 HtmlDocument 的通用版本;我必须为要实例化的正确类明确指定“HtmlAgilityPack.HtmlDocument”。
    猜你喜欢
    • 2011-07-21
    • 2014-09-11
    • 1970-01-01
    • 2011-01-16
    • 1970-01-01
    • 2013-02-13
    • 1970-01-01
    • 1970-01-01
    • 2020-05-13
    相关资源
    最近更新 更多