1

我正在使用 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]"

感谢您的时间和帮助:)

4

2 回答 2

0

我正在做类似的事情。我必须获取此信息,然后将其转换为 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。

于 2013-09-18T16:37:33.453 回答
0

这是您的 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();

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

于 2012-08-23T15:05:10.933 回答