C# 解析 HTML 实战指南
在网页开发和数据处理的场景中,经常需要从 HTML 文档里提取有用的信息。C# 作为一门强大的编程语言,提供了丰富的工具和库来实现 HTML 的解析。这篇博客就带你深入了解如何使用 C# 高效地解析 HTML。
一、为什么要在 C# 中解析 HTML
在实际项目中,无论是进行网页数据采集、网页内容分析,还是开发网页爬虫,都离不开对 HTML 的解析。例如,电商平台可能需要从竞品网站上采集商品价格和库存信息;新闻聚合应用可能需要从各大新闻网站提取文章标题、正文和发布时间。通过 C# 解析 HTML,能够自动化地获取这些关键数据,大大提高工作效率。
二、C# 解析 HTML 的常用工具和库
- HtmlAgilityPack:这是 C# 中最常用的 HTML 解析库之一,它提供了简单易用的 API,能够将 HTML 文档解析成一个 DOM(文档对象模型)树,方便开发者通过 XPath 或 CSS 选择器来提取节点和属性。
- AngleSharp:另一个功能强大的 HTML 解析库,支持现代的 HTML5 标准,并且在性能上表现出色。它同样可以构建 DOM 树,同时还提供了丰富的事件处理机制,方便处理复杂的网页结构。
三、使用 HtmlAgilityPack 解析 HTML
- 安装库:最简单的方式是通过 NuGet 包管理器。在 Visual Studio 中,右键点击项目,选择 “管理 NuGet 程序包”,搜索 “HtmlAgilityPack” 并安装。
- 基本解析示例:下面是一个使用 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属性的值。
- 提取复杂结构的数据:假设我们要从一个电商网页中提取商品信息,包括商品名称、价格和图片链接。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
- 安装库:同样通过 NuGet 包管理器搜索并安装 “AngleSharp”。
- 基本解析示例:使用 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 方面有强大的工具支持。在实际应用中,需要注意以下几点:
- 网页结构的变化:网页结构可能会经常更新,所以在编写解析代码时,要尽量使用灵活的 XPath 或 CSS 选择器,以适应结构的变化。
- 合法性检查:在处理提取到的数据时,要进行合法性检查,确保数据的准确性和完整性。
- 性能优化:当处理大量 HTML 文档时,要注意性能优化,例如合理使用缓存、批量处理等。
希望这篇博客能帮助你掌握 C# 解析 HTML 的技巧,在实际项目中高效地处理网页数据。如果在实践过程中有任何问题,欢迎在评论区留言交流。
相关文章:
C# 解析 HTML 实战指南
在网页开发和数据处理的场景中,经常需要从 HTML 文档里提取有用的信息。C# 作为一门强大的编程语言,提供了丰富的工具和库来实现 HTML 的解析。这篇博客就带你深入了解如何使用 C# 高效地解析 HTML。 一、为什么要在 C# 中解析 HTML 在实际项目中&…...
光谱相机在智能冰箱的应用原理与优势
食品新鲜度检测 详细可点击查看汇能感知团队实验报告:高光谱成像技术检测食物新鲜度 检测原理:不同新鲜程度的食品,其化学成分和结构会有所不同,在光谱下的反射、吸收等特性也存在差异。例如新鲜肉类和蔬菜中的水分、蛋白质、叶…...
编写0号中断的处理程序
实验内容、程序清单及运行结果 编写0号中断的处理程序(课本实验12) 解: assume cs:code code segment start: mov ax,cs mov ds,ax mov si,offset do mov ax,0 mov es,ax mov di,200h mov cx,offset doend-offset do ;安装中断例…...
“““【运用 R 语言里的“predict”函数针对 Cox 模型展开新数据的预测以及推理。】“““
主题与背景 本文主要介绍了如何在R语言中使用predict函数对已拟合的Cox比例风险模型进行新数据的预测和推理。Cox模型是一种常用的生存分析方法,用于评估多个因素对事件发生时间的影响。文章通过具体的代码示例展示了如何使用predict函数的不同参数来获取生存概率和…...
群晖docker获取私有化镜像http: server gave HTTP response to HTTPS client].
群晖docker获取私有化镜像提示http: server gave HTTP response to HTTPS clien 问题描述 层级时间用户事件Information2023/07/08 12:47:45cxlogeAdd image from xx.xx.31.240:1923/go-gitea/gitea:1.19.3Error2023/07/08 12:47:48cxlogeFailed to pull image [Get "http…...
使用 C++ 在深度学习中的应用:如何通过 C++20 构建高效神经网络
深度学习已经成为现代人工智能的核心技术,在图像识别、自然语言处理、语音识别等多个领域广泛应用。尽管 Python 因其简便易用和强大的深度学习框架(如 TensorFlow 和 PyTorch)而在这一领域占据主导地位,但 C 作为一门高性能语言&…...
当 Facebook 窥探隐私:用户的数字权利如何捍卫?
随着社交平台的普及,Facebook 已经成为全球用户日常生活的一部分。然而,伴随而来的隐私问题也愈发严峻。近年来,Facebook 频频被曝出泄露用户数据、滥用个人信息等事件,令公众对其隐私保护措施产生质疑。在这个信息化时代…...
Spring MVC中HandlerInterceptor和Filter的区别
目录 一、处理阶段 二、功能范围 三、参数访问 四、配置方式 五、使用场景说明 在Spring MVC中,HandlerInterceptor和Filter都是用于拦截请求的重要组件,但它们在多个方面存在显著的差异。本文将详细解析这两种拦截机制的区别,并结合使用…...
Android多语言开发自动化生成工具
在做 Android 开发的过程中,经常会遇到多语言开发的场景,尤其在车载项目中,多语言开发更为常见。对应多语言开发,通常都是在中文版本的基础上开发其他国家语言,这里我们会拿到中-外语言对照表,这里的工作难…...
回首2024,展望2025
2024年,是个充满挑战与惊喜的年份。在这366个日夜里,我站在编程与博客的交汇点,穿越了无数的风景与挑战,也迎来了自我成长的丰收时刻。作为开发者的第十年,我依然步伐坚定,心中始终带着对知识的渴望与对自我…...
Android SystemUI——快捷面板的显示(十五)
上一篇文章我们分析了 QSTileHost 初始化以及快捷设置面板的创建流程,这里我们继续来看一下快捷设置面板显示流程。 一、QS显示 对于界面的显示,我们同样从 Fragment 的 onViewCreated() 方法开始分析。 1、QSFragment 源码位置:/frameworks/base/packages/SystemUI/src/…...
放弃使用Dockerfiles 平替 docker init
您是那种觉得编写 Dockerfile 和 docker-compose.yml 文件很痛苦的人之一吗? 我承认,我就是其中之一。 我总是想知道我是否遵循了 Dockerfile、 docker-compose 文件的最佳编写实践,我害怕在不知不觉中引入了安全漏洞。 但是现在,…...
前端jquery 实现文本框输入出现自动补全提示功能
git仓库:web_study/some-demos/inputAutoFit at main Cong0925/web_study (github.com) 压缩包:已绑定到指定资源 示例图: 实现说明: 1.首先,html部分设置好相关的定位标签如图: 2.主要函数 3.默认数据...
vulfocus/fastjson-cnvd_2017_02833复现
漏洞概述 Fastjson 是阿里巴巴开发的一个高性能的 Java 库,用于将 Java 对象转换成 JSON 格式(序列化),以及将 JSON 字符串转换回 Java 对象(反序列化)。 fastjson在解析json的过程中,支持使用type字段来指…...
华为支付接入规范
为了确保用户获得良好的支付体验,Payment Kit制定了相关接入设计规范,请开发者遵照执行,具体要求(非强制性)如下: 一、支付方式呈现 涉及支付公司名称,请统一使用:花瓣支付ÿ…...
MySQL训练营-慢查询诊断问题
慢查询相关参数和建议配置 slow_query_log long_query_time 日志开关,是否记慢查询日志以及超过多长时间判定为慢查询。 查看参数设置: SHOW VARIABLES LIKE ‘slow_query_log’;SHOW VARIABLES LIKE ‘long_query_time’; 实践建议: …...
如何给自己的域名配置免费的HTTPS How to configure free HTTPS for your domain name
今天有小伙伴给我发私信,你的 https 到期啦 并且随手丢给我一个截图。 还真到期了。 javapub.net.cn 这个网站作为一个用爱发电的编程学习网站,用来存编程知识和面试题等,平时我都用业余时间来维护,并且还自费买了服务器和阿里云…...
.Net Core微服务入门全纪录(六)——EventBus-事件总线
系列文章目录 1、.Net Core微服务入门系列(一)——项目搭建 2、.Net Core微服务入门全纪录(二)——Consul-服务注册与发现(上) 3、.Net Core微服务入门全纪录(三)——Consul-服务注…...
1/20赛后总结
1/20赛后总结 T1『讨论区管理员』的旅行 - BBC编程训练营 算法:IDA* 分数:0 damn it! Ac_code走丢了~~(主要是没有写出来)~~ T2华强买瓜 - BBC编程训练营 算法:双向DFS或者DFS剪枝 分数:0 Ac_code…...
PVE 虚拟机安装 Debian 无图形化界面服务器
Debian 安装 Debian 镜像下载 找一个Debian镜像服务器,根据需要的版本和自己硬件选择。 iso-cd/:较小,仅包含安装所需的基础组件,可能需要网络访问来完成安装。有镜像 debian-12.9.0-amd64-netinst.isoiso-dvd/:较…...
告别“假系”与“低挂”,云酷智能安全带重塑房建、桥梁及外墙装修的高空作业安全
在房建、桥梁建设及外墙装修场景中,吊篮作业的高空坠落风险始终悬而未决。传统管理模式下,“人员不系安全带”或“低挂高用”的违规行为屡禁不止。云酷智能安全带通过物联网技术实现实时监测,已成功应用于中交、中建、中铁等央企项目…...
不花一分钱!用闲置电脑搭建永久Mac远程控制台(VNC+cpolar固定TCP教程)
零成本打造24小时在线的Mac远程开发环境 你是否有一台闲置的Mac电脑放在角落积灰?或者需要随时随地访问家里的开发环境?将旧Mac改造成全天候在线的远程工作站,不仅能充分利用闲置资源,还能为移动办公提供极大便利。本文将手把手教…...
5分钟掌握Fideo:终极免费直播录制软件使用指南
5分钟掌握Fideo:终极免费直播录制软件使用指南 【免费下载链接】fideo-live-record A convenient live broadcast recording software! Supports Tiktok, Youtube, Twitch, Bilibili, Bigo!(一款方便的直播录制软件! 支持tiktok, youtube, twitch, 抖音,…...
从零开始掌握drawio:免费开源绘图工具的全方位指南
1. 为什么你需要drawio这款绘图神器 第一次接触drawio是在三年前的一个项目会议上,当时团队需要快速绘制一套系统架构图。同事随手打开浏览器输入app.diagrams.net,五分钟内就搭建出了清晰的流程图框架。那一刻我才发现,原来专业绘图可以如此…...
一键部署Chat2DB:Docker与cpolar打造跨地域数据库管理神器
1. 为什么你需要Chat2DB和Docker的黄金组合 最近两年有个特别明显的趋势:数据正在从专业领域走向全民化。我见过太多产品经理被SQL卡住脖子,市场团队等一份报表要排期三天,甚至财务同事为了跑个月度数据要专门请IT部门吃饭。直到去年第一次用…...
GBase 8c 表空间规划和对象迁移
GBase 8c 表空间规划和对象迁移 我最近看 GBase 8c 资料时,越来越强烈的一个感觉是:很多现场不是不会建表空间,而是把表空间用得太晚、太散、太随意。 真正落到现场时,最常见的现象通常不是“不会执行 CREATE TABLESPACE”&#x…...
5分钟掌握B站评论区智能成分检测:免费高效的互动神器
5分钟掌握B站评论区智能成分检测:免费高效的互动神器 【免费下载链接】bilibili-comment-checker B站评论区自动标注成分,支持动态和关注识别以及手动输入 UID 识别 项目地址: https://gitcode.com/gh_mirrors/bil/bilibili-comment-checker B站成…...
Meshroom终极指南:零基础学会开源3D重建,从照片到模型的完整方案
Meshroom终极指南:零基础学会开源3D重建,从照片到模型的完整方案 【免费下载链接】Meshroom Node-based Visual Programming Toolbox 项目地址: https://gitcode.com/gh_mirrors/me/Meshroom 想要从普通照片创建专业级3D模型吗?Meshro…...
nginx——方向代理和负载均衡
目录 1.1 Nginx概述 1.1.1 企业青睐 Nginx 的核心原因 1.1.2 Nginx的作用 1.3 反向代理和负载均衡 1.4 注 1.4.1 代理百度并使用 18090 端口 1.1 Nginx概述 1.1.1 企业青睐 Nginx 的核心原因 Nginx 由俄罗斯开发者打造,具有超高稳定性(资源占用极低…...
5分钟搞定!Windows直接安装APK的终极免费方案
5分钟搞定!Windows直接安装APK的终极免费方案 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 你是否曾想在Windows电脑上直接安装安卓应用,却因…...
