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.mzph.cn/pingmian/67997.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring 是如何解决循环依赖问题

Spring 框架通过 三级缓存 机制来解决循环依赖问题。循环依赖是指两个或多个 Bean 相互依赖&#xff0c;形成一个闭环&#xff0c;例如 Bean A 依赖 Bean B&#xff0c;而 Bean B 又依赖 Bean A。Spring 通过提前暴露未完全初始化的 Bean 来解决这个问题。 以下是 Spring 解决…

vxe-table和element表尾合计行

1、vxe-table vxe-table的表尾合计&#xff0c;需要show-footer和footer-method搭配使用。 <vxe-table:data"tableData"ref"vxeRef"border resizable :footer-method"footerMethod":show-footer"true" >…

监控与调试:性能优化的利器 — ShardingSphere

在分布式数据库系统中&#xff0c;监控和调试是确保系统高效运行的关键。ShardingSphere 提供了多种监控和调试工具&#xff0c;帮助开发者实时跟踪和优化性能&#xff0c;识别瓶颈&#xff0c;进行故障排查&#xff0c;从而提升系统的稳定性和响应速度。本文将介绍如何使用 Sh…

上位机知识篇---ROS2命令行命令静态链接库动态链接库

文章目录 前言第一部分&#xff1a;ROS2命令行命令1. 基础命令&#xff08;1&#xff09;ros2 run&#xff08;2&#xff09;ros2 launch&#xff08;3&#xff09;ros2 node&#xff08;4&#xff09;ros2 topic&#xff08;5&#xff09;ros2 service&#xff08;6&#xff0…

Browser-Use WebUI项目启动指南

摘要 此前发布《Browser - Use WebUI 使用体验》博文后&#xff0c;鉴于部分朋友运行时出现问题&#xff0c;重新运行并整理相关内容。本文详细记录 Web UI 项目启动全过程&#xff0c;涵盖 Python 3.11、Chrome 浏览器及 API Keys 等环境要求&#xff0c;Python 环境检查、依赖…

leetcode 面试经典 150 题:有效的括号

链接有效的括号题序号20题型字符串解法栈难度简单熟练度✅✅✅ 题目 给定一个只包括 ‘(’&#xff0c;‘)’&#xff0c;‘{’&#xff0c;‘}’&#xff0c;‘[’&#xff0c;‘]’ 的字符串 s &#xff0c;判断字符串是否有效。 有效字符串需满足&#xff1a; 左括号必须…

Grafana系列之Dashboard:新增仪表板、新增变量、过滤变量、变量查询、导入仪表板、变量联动、Grafana Alert

概述 关于Prometheus和Grafana的安装&#xff0c;略过。 写在前面 Dashboard&#xff1a;仪表板&#xff0c;可包含多个PanelPanel&#xff1a;面板&#xff0c;Dashboard中的组件 如有写得不对的地方&#xff0c;烦请指出。 新增仪表板 点击右上角的 选择New dashboard…

使用 Ansys Discovery 对离心风机进行仿真

了解设置模拟并获得有用结果的步骤。 离心风机&#xff1a;基础知识和重要性 离心风机&#xff0c;也称为径流式风机&#xff0c;是旨在通过将动能转化为势能来增加空气或气体的压力和流量的机械装置。它们的工作原理是利用旋转叶轮产生的离心力轴向吸入空气&#xff0c;然后…

客户案例:向导ERP与金蝶云星空集成方案

一、客户背景 该客户公司主要致力于黄金、铂金、金镶玉首饰的研发设计、生产加工、批发及直营加盟业务。公司总部占地面积目前已达6000多平方米&#xff0c;拥有标准生产厂房和现代化生产设施&#xff0c;拥有一支完善的企业管理团队和专业技工队伍。 该企业目前同时采用向导 E…

mac 通过 Homebrew 安装 git 遇到的问题

问题真多啊 &#xff01;&#xff01;&#xff01; 解决方式 见 1. / 2. / 3 . / 4. / 5. remote: Enumerating objects: 290323, done. remote: Counting objects: 100% (473/473), done. remote: Compressing objects: 100% (253/253), done. error: RPC failed; curl 92 H…

springboot 引入 单元测试 @Test

springboot版本 2.6 引入依赖 <dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter</artifactId><version>5.8.1</version><scope>test</scope></dependency>写测试类 package com.mv.m…

机器学习-K近邻算法

文章目录 一. 数据集介绍Iris plants dataset 二. 代码三. k值的选择 一. 数据集介绍 鸢尾花数据集 鸢尾花Iris Dataset数据集是机器学习领域经典数据集&#xff0c;鸢尾花数据集包含了150条鸢尾花信息&#xff0c;每50条取自三个鸢尾花中之一&#xff1a;Versicolour、Setosa…

【豆包MarsCode蛇年编程大作战】花样贪吃蛇

目录 引言 展示效果 prompt提示信息 第一次提示&#xff08;实现基本功能&#xff09; 初次实现效果 第二次提示&#xff08;美化UI&#xff09; 第一次美化后的效果 第二次美化后的效果 代码展示 实现在线体验链接 码上掘金使用教程 体验地址&#xff1a; 花样贪吃蛇…

小白爬虫——selenium入门超详细教程

目录 一、selenium简介 二、环境安装 2.1、安装Selenium 2.2、浏览器驱动安装 三、基本操作 3.1、对页面进行操作 3.1.1、初始化webdriver 3.1.2、打开网页 3.1.3、页面操作 3.1.4、页面数据提取 3.1.5、关闭页面 ?3.1.6、综合小案例 3.2、对页面元素进行操作 3…

U3D的.Net学习

Mono&#xff1a;这是 Unity 最初采用的方式&#xff0c;它将 C# 代码编译为中间语言 (IL)&#xff0c;然后在目标平台上使用虚拟机 (VM) 将其转换为本地机器码执行。 IL2CPP&#xff1a;这是一种较新的方法&#xff0c;它会将 C# 代码先编译为 C 代码&#xff0c;再由 C 编译器…

Java集合学习:HashMap的原理

一、HashMap里的Hash是什么&#xff1f; 首先&#xff0c;我们先要搞清楚HashMap里的的Hash是啥意思。 当我们在编程过程中&#xff0c;往往需要对线性表进行查找操作。 在顺序表中查找时&#xff0c;需要从表头开始&#xff0c;依次遍历比较a[i]与key的值是否相等&#xff…

SOAFEE 技术研讨会:汽车软件定义与自动驾驶技术探讨

在本次技术研讨会上&#xff0c;来自汽车与科技领域的专家们围绕汽车软件定义及自动驾驶技术展开了深入交流与探讨。从 SOAFEE 蓝图计划的创新性理念&#xff0c;到 Autoware 开源项目及 Open AD Kit 在实际应用中的探索&#xff0c;再到 Edge Workload Abstraction and Orches…

FastJson很快,有什么用?

FastJson 在国内的热度还是挺高的&#xff0c;受到了很多开发者的喜欢。不过&#xff0c;我自己倒没有在项目中用过。我记得刚工作那会新做的一个项目有明确规定禁止使用 FastJson。 昨天看到一篇关于 FastJson 的文章&#xff0c;这位朋友分享了自己在使用 FastJson 遇到的一…

react antd点击table单元格文字下载指定的excel路径

在使用 Ant Design (antd) 的 Table 组件时&#xff0c;如果想点击表格单元格中的文字来触发下载指定路径的 Excel 文件&#xff0c;可以通过以下步骤实现&#xff1a; 1. 确保有一个可供下载的 Excel 文件&#xff1a;需要有一个服务器端点或者一个可以直接访问的 URL&#xf…

Jetson nano 安装 PCL 指南

本指南帮助 ARM64 架构的 Jetson Nano 安装 PCL&#xff08;点云库&#xff09;。 安装步骤 第一步&#xff1a;安装依赖 在终端中运行以下命令&#xff0c;安装 PCL 所需的依赖&#xff1a; sudo apt-get update sudo apt-get install git build-essential linux-libc-dev s…