HtmlAgilityPack是使用C#编写的开源HTML解析库,可以轻松解析和操作HTML文档。在C#中使用HtmlAgilityPack执行各种任务,如提取数据、修改文档结构等。在本文中,我们将详细了解HtmlAgilityPack的应用。
1.安装HtmlAgilityPack
在使用HtmlAgilityPack之前,需要下载并安装它。您可以通过Nuget管理器在Visual Studio中安装它,也可以从Github在线存储库下载并手动添加到项目中。
2.加载HTML文件
使用HtmlDocument类的Load方法加载HTML文件:
var htmlDoc = new HtmlDocument(); htmlDoc.Load("test.html");
还可以使用LoadHtml方法加载HTML字符串:
var htmlDoc = new HtmlDocument(); var htmlString = "<html><head><title>Test</title></head><body></body></html>"; htmlDoc.LoadHtml(htmlString);
3.获取元素
要获取HTML文档中的元素,可以使用SelectNodes和SelectSingleNode方法。SelectNodes返回一个HtmlNodeCollection对象,其中包含与选择器匹配的所有节点。SelectSingleNode返回一个HtmlNode对象,表示匹配选择器的第一个节点。
例如,要获取所有P元素,可以使用以下代码:
var pNodes = htmlDoc.DocumentNode.SelectNodes("//p");
要获取第一个H1元素,可以使用以下代码:
var h1Node = htmlDoc.DocumentNode.SelectSingleNode("//h1");
4.遍历元素节点
要遍历HTML文档中的所有元素节点,可以使用HtmlNodeCollection对象。您可以使用foreach循环,也可以使用LINQ查询中的方法,例如Where和Select。
例如,要遍历所有DIV元素,并输出其innerText属性,可以使用以下代码:
var divNodes = htmlDoc.DocumentNode.SelectNodes("//div"); foreach (var divNode in divNodes) { Console.WriteLine(divNode.InnerText); }
还可以使用LINQ,例如:
var divNodes = htmlDoc.DocumentNode.Descendants("div"); var divTexts = divNodes.Select(d => d.InnerText); foreach (var divText in divTexts) { Console.WriteLine(divText); }
5.获取元素的属性
要获取元素的属性,可以使用GetAttributeValue方法。GetAttributeValue方法接受两个参数:属性名称和默认值。如果找不到指定的属性,则方法将返回指定的默认值。
例如,要获取具有id为test的元素的href属性,可以使用以下代码:
var testNode = htmlDoc.DocumentNode.SelectSingleNode("//a[@id='test']"); var href = testNode.GetAttributeValue("href", "");
6.修改HTML文档
使用HtmlNode类的一些属性和方法可以修改HTML文档。例如,InnerHtml和OuterHtml属性可用于设置元素的内部内容和外部HTML标记。
例如,要将H1元素的innerText属性更改为“New Title”,可以使用以下代码:
var h1Node = htmlDoc.DocumentNode.SelectSingleNode("//h1"); h1Node.InnerHtml = "New Title";
7.添加新元素
可以使用CreateElement方法创建新元素,使用AppendChild或InsertBefore方法将其添加到文档中。
例如,要创建一个新的DIV元素并在BODY元素的末尾添加它,可以使用以下代码:
var divNode = htmlDoc.CreateElement("div"); divNode.InnerHtml = "New div content"; var bodyNode = htmlDoc.DocumentNode.SelectSingleNode("//body"); bodyNode.AppendChild(divNode);
8.删除元素
使用Remove方法可以删除元素。
例如,要删除具有id为test的元素,可以使用以下代码:
var testNode = htmlDoc.DocumentNode.SelectSingleNode("//div[@id='test']"); testNode.Remove();
9.过滤元素
可以使用Where和FirstOrDefault方法过滤HtmlNodeCollection对象,以获得与条件匹配的元素节点。
例如,要获取具有类名为“content”的DIV元素,可以使用以下代码:
var contentDiv = htmlDoc.DocumentNode.Descendants("div") .Where(d => d.Attributes["class"] != null && d.Attributes["class"].Value.Contains("content")) .FirstOrDefault();
10.解析HTML标记
使用HtmlAgilityPack,您可以解析和分析HTML标记,以获取它们的名称,属性和值。以下是一个示例,演示如何解析HTML标记并输出其名称,属性和值。
var html = "<div class='test' id='1'>Hello world!</div>"; var htmlDoc = new HtmlDocument(); htmlDoc.LoadHtml(html); var divNode = htmlDoc.DocumentNode.SelectSingleNode("//div"); var tag = divNode.Name; // tag = div var classAttr = divNode.Attributes["class"].Value; // classAttr = test var idAttr = divNode.Attributes["id"].Value; // idAttr = 1 var innerText = divNode.InnerText; // innerText = Hello world!
11.XPath表达式
XPath表达式是一种查找XML或HTML文档中元素的语言。HtmlAgilityPack支持XPath表达式,可以轻松选择需要的元素。以下是一些XPath表达式示例:
- 选择所有P元素://p
- 选择具有CLASS属性的所有DIV元素://div[@class]
- 选择具有ID为test的A元素://a[@id='test']
- 获取HTML代码的片段
使用HtmlNode.InnerHtml属性,可以获取包含HTML节点及其内部代码的字符串。
例如,要获取具有ID为test的DIV元素及其内部HTML代码的字符串,可以使用以下代码:
var testDiv = htmlDoc.DocumentNode.SelectSingleNode("//div[@id='test']").InnerHtml;
12.获取HTML节点的完整HTML代码
使用HtmlNode.OuterHtml属性,可以获取HTML节点及其完整的HTML代码,包括标记和属性。
例如,要获取ID为test的DIV元素的完整HTML代码,可以使用以下代码:
var testDivHtml = htmlDoc.DocumentNode.SelectSingleNode("//div[@id='test']").OuterHtml;
总结
在C#中,HtmlAgilityPack是使用最广泛的HTML解析库之一。使用它,可以轻松地加载HTML文档,提取数据,修改文档结构等。通过XPath表达式,您可以更快速地选择所需的元素。HtmlAgilityPack非常易于安装和使用,因此是许多开发人员的首选工具。