【问题标题】:Duplicating HtmlNode in HtmlAgilityPack?在 HtmlAgilityPack 中复制 HtmlNode?
【发布时间】:2013-09-19 00:37:33
【问题描述】:

我正在使用 HTML Agility Pack 在同一页面上执行两项不同的操作。
对于第一个,我需要删除脚本、样式等元素。 但是对于第二个,我必须保留所有元素。

由于我不能在第一部分之前完成第二部分,所以我首先正在寻找一种复制对象的方法,这样我就可以保存第二部分的所有元素。 那是我尝试过的代码,但由于某些原因,我没有得到其中的节点。

        HtmlDocument HTMLdoc = new HtmlDocument();
        HTMLdoc.LoadHtml(sFetch);

        //duplicate document node
        var webPage = HtmlNode.CreateNode("<html></html>");
        webPage.CopyFrom(HTMLdoc.DocumentNode,true);

我想到的另一种方法是反转选择我要删除的所有元素的 xpath。所以我将能够只选择它们而无需真正从对象中删除元素。 但我不知道如何使用 XPath“not()”函数来反转我的查询。 这是我的 XPath 查询:

"//script | //style | //iframe | //select | //textarea | //comment() | //a[@href]"

感谢您的时间和帮助:)

【问题讨论】:

标签: c# xpath html-agility-pack


【解决方案1】:

这是您的 XPath 表达式的 倒置 版本:

var nodes = doc.DocumentNode
    .SelectNodes("//node()[not(self::script or self::style or self::iframe or self::select or self::textarea or self::comment() or self::a[@href])]")
    .ToList();

这将选择除脚本、样式等之外的节点。

【讨论】:

  • 这对我没有帮助,因为我必须保持 documentNode 原样而不是删除它的节点。
  • @meirlo,用你的 xpath 的 inverted 版本更新了我的答案
【解决方案2】:

我正在做类似的事情。我必须获取此信息,然后将其转换为 XML。这是您需要的:

        HtmlAgilityPack.HtmlDocument htmlDoc = new HtmlAgilityPack.HtmlDocument();
        htmlDoc.LoadHtml(sfetch);

        HtmlNodeCollection page = htmlDoc.DocumentNode.SelectNodes("//table");//whatever tags your are looking for in your doc

        foreach (HtmlNode value in page)
        {
            richTxtboxFilteredHTML.Text += value.InnerText;
        }

如果您要进一步处理此问题,则需要继续引用每个 HtmlNode。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-13
    • 2011-08-11
    • 1970-01-01
    • 1970-01-01
    • 2013-05-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多