当前位置: 首页 > article >正文

C# 解析 HTML 实战指南

在网页开发和数据处理的场景中,经常需要从 HTML 文档里提取有用的信息。C# 作为一门强大的编程语言,提供了丰富的工具和库来实现 HTML 的解析。这篇博客就带你深入了解如何使用 C# 高效地解析 HTML。

一、为什么要在 C# 中解析 HTML

在实际项目中,无论是进行网页数据采集、网页内容分析,还是开发网页爬虫,都离不开对 HTML 的解析。例如,电商平台可能需要从竞品网站上采集商品价格和库存信息;新闻聚合应用可能需要从各大新闻网站提取文章标题、正文和发布时间。通过 C# 解析 HTML,能够自动化地获取这些关键数据,大大提高工作效率。

二、C# 解析 HTML 的常用工具和库

  1. HtmlAgilityPack:这是 C# 中最常用的 HTML 解析库之一,它提供了简单易用的 API,能够将 HTML 文档解析成一个 DOM(文档对象模型)树,方便开发者通过 XPath 或 CSS 选择器来提取节点和属性。
  1. AngleSharp:另一个功能强大的 HTML 解析库,支持现代的 HTML5 标准,并且在性能上表现出色。它同样可以构建 DOM 树,同时还提供了丰富的事件处理机制,方便处理复杂的网页结构。

三、使用 HtmlAgilityPack 解析 HTML

  1. 安装库:最简单的方式是通过 NuGet 包管理器。在 Visual Studio 中,右键点击项目,选择 “管理 NuGet 程序包”,搜索 “HtmlAgilityPack” 并安装。
  1. 基本解析示例:下面是一个使用 HtmlAgilityPack 从 HTML 字符串中提取所有链接的代码示例:

using HtmlAgilityPack;

class Program

{

static void Main()

{

string html = "<html><body><a href='https://www.example.com'>Example Link</a></body></html>";

HtmlDocument doc = new HtmlDocument();

doc.LoadHtml(html);

HtmlNodeCollection links = doc.DocumentNode.SelectNodes("//a");

if (links!= null)

{

foreach (HtmlNode link in links)

{

string href = link.GetAttributeValue("href", "");

Console.WriteLine($"Link: {href}");

}

}

}

}

在这段代码中,首先创建了一个HtmlDocument对象并加载 HTML 字符串。然后使用SelectNodes方法结合 XPath 表达式//a来选取所有的<a>标签节点,最后遍历这些节点并提取href属性的值。

  1. 提取复杂结构的数据:假设我们要从一个电商网页中提取商品信息,包括商品名称、价格和图片链接。HTML 结构可能如下:

<div class="product">

<img src="product1.jpg" alt="Product Name">

<h2 class="product-name">Product 1</h2>

<span class="price">$19.99</span>

</div>

使用 HtmlAgilityPack 提取数据的代码如下:


using HtmlAgilityPack;

class Product

{

public string Name { get; set; }

public string Price { get; set; }

public string ImageUrl { get; set; }

}

class Program

{

static void Main()

{

string html = "<div class='product'><img src='product1.jpg' alt='Product Name'><h2 class='product-name'>Product 1</h2><span class='price'>$19.99</span></div>";

HtmlDocument doc = new HtmlDocument();

doc.LoadHtml(html);

HtmlNode productNode = doc.DocumentNode.SelectSingleNode("//div[@class='product']");

if (productNode!= null)

{

Product product = new Product();

HtmlNode imgNode = productNode.SelectSingleNode(".//img");

if (imgNode!= null)

{

product.ImageUrl = imgNode.GetAttributeValue("src", "");

}

HtmlNode nameNode = productNode.SelectSingleNode(".//h2[@class='product-name']");

if (nameNode!= null)

{

product.Name = nameNode.InnerText;

}

HtmlNode priceNode = productNode.SelectSingleNode(".//span[@class='price']");

if (priceNode!= null)

{

product.Price = priceNode.InnerText;

}

Console.WriteLine($"Name: {product.Name}, Price: {product.Price}, ImageUrl: {product.ImageUrl}");

}

}

}

这里使用SelectSingleNode方法结合 XPath 表达式来精确选取需要的节点,并提取相应的属性和文本内容。

四、使用 AngleSharp 解析 HTML

  1. 安装库:同样通过 NuGet 包管理器搜索并安装 “AngleSharp”。
  1. 基本解析示例:使用 AngleSharp 提取所有链接的代码如下:

using AngleSharp;

using System.Threading.Tasks;

class Program

{

static async Task Main()

{

string html = "<html><body><a href='https://www.example.com'>Example Link</a></body></html>";

var context = BrowsingContext.New();

var document = await context.OpenAsync(req => req.Content(html));

var links = document.QuerySelectorAll("a");

foreach (var link in links)

{

string href = link.GetAttribute("href");

Console.WriteLine($"Link: {href}");

}

}

}

在这段代码中,通过BrowsingContext.New()创建一个浏览上下文,然后使用OpenAsync方法加载 HTML 字符串并得到一个IDocument对象。接着使用QuerySelectorAll方法结合 CSS 选择器来选取所有的<a>标签,最后提取href属性。

五、总结与注意事项

通过上述示例,我们可以看到 C# 在解析 HTML 方面有强大的工具支持。在实际应用中,需要注意以下几点:

  1. 网页结构的变化:网页结构可能会经常更新,所以在编写解析代码时,要尽量使用灵活的 XPath 或 CSS 选择器,以适应结构的变化。
  1. 合法性检查:在处理提取到的数据时,要进行合法性检查,确保数据的准确性和完整性。
  1. 性能优化:当处理大量 HTML 文档时,要注意性能优化,例如合理使用缓存、批量处理等。

希望这篇博客能帮助你掌握 C# 解析 HTML 的技巧,在实际项目中高效地处理网页数据。如果在实践过程中有任何问题,欢迎在评论区留言交流。


http://www.kler.cn/a/511566.html

相关文章:

  • vue+高德API搭建前端3D交通页面
  • 解锁辅助驾驶新境界:基于昇腾 AI 异构计算架构 CANN 的应用探秘
  • Reactor 模式在 Edis、Nginx 和 Netty 中的应用与高性能网络模式解析
  • llava 导入process报错
  • JSON数据格式的序列化和反序列化jackson针对首字母小学的字段返回序列化后第2个大写字母也变成小写的问题处理
  • 安装httpd
  • Perl语言的数据库编程
  • Git基础指南
  • C++性能优化指南:探索无锁队列设计与实现
  • Docker配置国内镜像源
  • MySQL - 主从同步
  • 4.6.2排序(三)冒泡排序与简单选择排序算法
  • 【数据库日志】undo log、redo log和bin log作用及原理
  • Docker的原理:如何理解容器技术的力量
  • 基于Matlab实现MPC模型预测控制仿真程序(源码)
  • 【Spiffo】环境配置:Linux下LVGL项目构建(含v8、v9)、针对git不到子项目的手动组装
  • java spring,uName,kValue,前端传值后端接不到
  • 《知识图谱:鸿蒙NEXT中人工智能的智慧基石》
  • 【蓝桥杯】43687.赢球票
  • 【Linux系统】Linux下的图形库 ncurses(简单认识)
  • 基于VSCode+CMake+debootstrap搭建Ubuntu交叉编译开发环境
  • 电子电气架构 --- ECU故障诊断指南
  • LeetCode 题目 2545. 根据第 K 场考试的分数排序
  • Yii框架中的数据提取:从不同数据源获取数据
  • GoLang教程002:Go语言中的变量声明
  • Flutter+vsCode 安装问题记录