我正在使用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]"
感谢您的时间和帮助:)
答案 0 :(得分: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();
这将选择除脚本,样式等之外的节点
答案 1 :(得分: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。