c#教你网站数据轻松解析抓取,HtmlAgilityPack解析的奇妙之处

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非常易于安装和使用,因此是许多开发人员的首选工具。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

然然学长

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值