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

本文涉及的产品
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
简介: 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非常易于安装和使用,因此是许多开发人员的首选工具。


相关文章
|
28天前
|
消息中间件 存储 缓存
十万订单每秒热点数据架构优化实践深度解析
【11月更文挑战第20天】随着互联网技术的飞速发展,电子商务平台在高峰时段需要处理海量订单,这对系统的性能、稳定性和扩展性提出了极高的要求。尤其是在“双十一”、“618”等大型促销活动中,每秒需要处理数万甚至数十万笔订单,这对系统的热点数据处理能力构成了严峻挑战。本文将深入探讨如何优化架构以应对每秒十万订单级别的热点数据处理,从历史背景、功能点、业务场景、底层原理以及使用Java模拟示例等多个维度进行剖析。
53 8
|
26天前
|
数据采集 自然语言处理 搜索推荐
基于qwen2.5的长文本解析、数据预测与趋势分析、代码生成能力赋能esg报告分析
Qwen2.5是一款强大的生成式预训练语言模型,擅长自然语言理解和生成,支持长文本解析、数据预测、代码生成等复杂任务。Qwen-Long作为其变体,专为长上下文场景优化,适用于大型文档处理、知识图谱构建等。Qwen2.5在ESG报告解析、多Agent协作、数学模型生成等方面表现出色,提供灵活且高效的解决方案。
126 49
|
15天前
|
XML JSON JavaScript
HttpGet 请求的响应处理:获取和解析数据
HttpGet 请求的响应处理:获取和解析数据
|
22天前
|
监控 前端开发 安全
如何开发一个网站:全面解析与实战指南
在数字化时代,网站是企业和个人展示形象、传播信息的关键平台。本文提供从规划、设计、开发、上线到后期维护的全方位网站开发指南,涵盖明确目标、分析用户、设定功能需求、设计风格、技术选型、测试部署及优化升级等内容,帮助你打造既美观又实用的网站。
30 4
|
21天前
|
数据采集 JavaScript 网络安全
为什么PHP爬虫抓取失败?解析cURL常见错误原因
豆瓣电影评分是电影市场的重要参考,通过网络爬虫技术可以高效采集评分数据,帮助电影制作和发行方优化策略。本文介绍使用PHP cURL库和代理IP技术抓取豆瓣电影评分的方法,解决反爬机制、网络设置和数据解析等问题,提供详细代码示例和优化建议。
为什么PHP爬虫抓取失败?解析cURL常见错误原因
|
1月前
|
存储 分布式计算 Java
存算分离与计算向数据移动:深度解析与Java实现
【11月更文挑战第10天】随着大数据时代的到来,数据量的激增给传统的数据处理架构带来了巨大的挑战。传统的“存算一体”架构,即计算资源与存储资源紧密耦合,在处理海量数据时逐渐显露出其局限性。为了应对这些挑战,存算分离(Disaggregated Storage and Compute Architecture)和计算向数据移动(Compute Moves to Data)两种架构应运而生,成为大数据处理领域的热门技术。
55 2
|
1月前
|
JavaScript API 开发工具
<大厂实战场景> ~ Flutter&鸿蒙next 解析后端返回的 HTML 数据详解
本文介绍了如何在 Flutter 中解析后端返回的 HTML 数据。首先解释了 HTML 解析的概念,然后详细介绍了使用 `http` 和 `html` 库的步骤,包括添加依赖、获取 HTML 数据、解析 HTML 内容和在 Flutter UI 中显示解析结果。通过具体的代码示例,展示了如何从 URL 获取 HTML 并提取特定信息,如链接列表。希望本文能帮助你在 Flutter 应用中更好地处理 HTML 数据。
113 1
|
26天前
|
数据采集 存储 自然语言处理
基于Qwen2.5的大规模ESG数据解析与趋势分析多Agent系统设计
2022年中国上市企业ESG报告数据集,涵盖制造、能源、金融、科技等行业,通过Qwen2.5大模型实现报告自动收集、解析、清洗及可视化生成,支持单/多Agent场景,大幅提升ESG数据分析效率与自动化水平。
|
1月前
|
C# 开发者
C# 一分钟浅谈:Code Contracts 与契约编程
【10月更文挑战第26天】本文介绍了 C# 中的 Code Contracts,这是一个强大的工具,用于通过契约编程增强代码的健壮性和可维护性。文章从基本概念入手,详细讲解了前置条件、后置条件和对象不变量的使用方法,并通过具体代码示例进行了说明。同时,文章还探讨了常见的问题和易错点,如忘记启用静态检查、过度依赖契约和性能影响,并提供了相应的解决建议。希望读者能通过本文更好地理解和应用 Code Contracts。
34 3
|
28天前
|
设计模式 C# 图形学
Unity 游戏引擎 C# 编程:一分钟浅谈
本文介绍了在 Unity 游戏开发中使用 C# 的基础知识和常见问题。从 `MonoBehavior` 类的基础用法,到变量和属性的管理,再到空引用异常、资源管理和性能优化等常见问题的解决方法。文章还探讨了单例模式、事件系统和数据持久化等高级话题,旨在帮助开发者避免常见错误,提升游戏开发效率。
42 4

推荐镜像

更多