首页 文章

在HtmlAgilityPack中复制HtmlNode?

提问于
浏览
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]"

谢谢你的时间和帮助:)

2 回答

  • 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();
    

    这将选择除脚本,样式等之外的节点 .

  • 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 .

相关问题