C# 使用HtmlAgilityPack解析提取HTML内容

news2025/1/24 8:52:35

写在前面
 

HtmlAgilityPack是一个HTML解析类库,日常用法就是爬虫获取到内容后,先用XPath获取目标节点,再用正则进行匹配;使用XPath的目的主要是将目标节点或内容限定在一个较小的范围,如果一上来就用正则那效率肯定不行,因为正则的规则设计耗时较长;而XPath直接可以用浏览器F12开发者工具窗口,鼠标右键复制XPath获得,非常方便。但在微观内容的操作上XPath就显得太粗糙了,这时候就需要用正则来匹配,由于范围已经用XPath做过了筛选,所以此时的正则规则的设计要考虑的就很少了;两者结合效率就大大提升了,解析HTML源码实在是个耗时费力的体力活。

 老套路通过NuGet获取类库

代码实现

    using HtmlAgilityPack;

    public static class HtmlDocumentMgr
    {
        #region Public Methods

        public static HtmlNodeCollection GetNodes(string xPath)
        {
            var body = BrowserController.GetFrameBody();
            var doc = GetHtmlDocument(body);
            return doc.DocumentNode.SelectNodes(xPath);
        }

        public static HtmlNode GetNode(string xPath)
        {
            var body = BrowserController.GetFrameBody();
            var doc = GetHtmlDocument(body);
            return doc.DocumentNode.SelectSingleNode(xPath);
        }

        public static HtmlDocument GetHtmlDocument(string html)
        {
            var doc = new HtmlDocument();
            doc.LoadHtml(html);
            return doc;
        }


        #endregion

    }

 HTML 内容可以是独立爬虫直接获取的,也可以从内嵌浏览器中获得,本文采用内嵌浏览器的方式,获得HTML的代码如下,仅做参考示意。

        public static string GetFrameBody()
        {
            var js = "document.querySelector('body').outerHTML";
            var evalRet = Browser.MainFrame.EvaluateScriptAsync(js);
            evalRet.Wait();
            if (evalRet.Result != null)
            {
                var ret = evalRet.Result.Result;
                return ret.ToNormalString();
            }
            return string.Empty;
        }

调用示例

        public static HtmlNode GetDescribeNode(string describe)
        {
            var body = BrowserController.GetFrameBody();
            var doc = new HtmlDocument();
            doc.LoadHtml(body);

            var match = string.Format(".//label[contains(text(), \"{0}\")]", describe);
            var labelNode = doc.DocumentNode.SelectSingleNode(match);
            if (labelNode == null && describe.Contains(" "))
            {
                describe = describe.Replace(" ", " ");
                match = string.Format(".//label[contains(text(), \"{0}\")]", describe);
                labelNode = doc.DocumentNode.SelectSingleNode(match);
            }
            return labelNode;
        }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1279403.html

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

相关文章

osg LOD节点动态调度

1、LOD节点 LOD(level of detail):是指根据物体模型的结点在显示环境中所处的位置和重要度,决定物体渲染的资源分配,降低非重要物体的面数和细节度,从而获得高效率的渲染运算。在OSG的场景结点组织结构中&…

栈实现队列,力扣

题目地址: 232. 用栈实现队列 - 力扣(LeetCode) 难度:简单 今天刷栈实现队列,大家有兴趣可以点上看看题目要求,试着做一下。 题目: 请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支…

基于社区电商的Redis缓存架构-库存模块缓存架构(下)

基于缓存分片的下单库存扣减方案 将商品进行数据分片,并将分片分散存储在各个 Redis 节点中,那么如何计算每次操作商品的库存是去操作哪一个 Redis 节点呢? 我们对商品库存进行了分片存储,那么当扣减库存的时候,操作…

3.4_1 java自制小工具 - pdf批量转图片

相关链接 目录参考文章:pdf转图片(apache pdfbox)参考文章:GUI界面-awt参考文章:jar包转exe(exe4j)参考文章:IDEA导入GIT项目参考文章:IDEA中使用Gitee管理代码gitee项目链接:pdf_2_image网盘地址&#xf…

HCIP-十六、IGMPPIM-SM 组播

十六、IGMP&PIM-SM 组播 IGMP实验拓扑实验需求及解法1. 配置各设备IP地址2. R1启用组播功能,并在g0/0/0和g0/0/1上开启pim dm3. R1的g0/0/1开启igmp协议 PIM-SM实验拓扑实验需求及解法1.配置各设备IP地址。2.运行IGP3.R1/2/3/4运行PIM-SM IGMP 实验拓扑 实验需…

内网穿透工具获取一个公网ip

下载地址:点击即可下载很简单 然后将他复制到上面的命令行窗口直接回车

SQL自学通之查询--SELECT语句的使用

一、前言 1、目标 在今天你将学习到以下内容: l 如何写SQL的查询 l 将表中所有的行选择和列出 l 选择和列出表中的选定列 l 选择和列出多个表中的选定列 2、背景 在上篇中我们简要地介绍了关系型数据库系统所具有的强大功能 在对 SQL 进行了 简要的介绍中我们…

scrapy-redis

一、什么是scrapy-redis Scrapy-Redis 是 Scrapy 框架的一个扩展,它提供了对 Redis 数据库的支持,用于实现分布式爬取。通过使用 Scrapy-Redis,你可以将多个 Scrapy 进程连接到同一个 Redis 服务器,共享任务队列和去重集&#xf…

食物相关的深度学习数据集合集—食物、饮料、肉类、餐具等数据集

最近收集了一大波与食物酒水相关的数据集,包含食物、饮料、肉类、餐具等不同等类型的数据集,废话不多说,给大家逐一介绍!! 1、自制啤酒配方数据库 超过20万自制啤酒配方数据库,数据集包含不同精酿啤酒的名…

C# WPF上位机开发(绘图软件)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 本身c# wpf可以看成是生产力工具,它的意义在于可以快速根据业务的情况,把产品模型搭建出来。这一点不像c/c,需要…

4.OpenResty系列之Nginx负载均衡

1. 负载均衡配置 上篇文章中,代理仅仅指向一个服务器。但是,网站在实际运营过程中,大部分都是以集群的方式运行,这时需要使用负载均衡来分流。nginx 也可以实现简单的负载均衡功能。 假设这样一个应用场景:将应用部署…

智能优化算法应用:基于狮群算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于狮群算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于狮群算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.狮群算法4.实验参数设定5.算法结果6.参考文献7.MATLAB…

想进国家电网,电气类专业都有哪些就业方向呢?

电气工程及自动化专业的主干课程都有哪些,笔者跟你分享一下就业方向都有哪些主要课程呢?包含电路原理、模拟电子技术、数字电子技术工程、电磁场、微机原理与接口技术、自动控制原理、电机学、电力电子技术、电力系统分析等等。 电气类专业都有哪些就业方…

使用idea如何快速的搭建ssm的开发环境

文章目录 唠嗑部分言归正传1、打开idea,点击新建项目2、填写信息3、找到pom.xml先添加springboot父依赖4、添加其他依赖5、编写启动类、配置文件6、连接创建数据库、创建案例表7、安装MybatisX插件8、逆向工程9、编写controller10、启动项目、测试 结语 唠嗑部分 小…

技术阅读周刊第第8️⃣期

技术阅读周刊,每周更新。 历史更新 20231103:第四期20231107:第五期20231117:第六期20231124:第七期 Prometheus vs. VictoriaMetrics (VM) | Last9 URL: https://last9.io/blog/prometheus-vs-victoriametrics/?refd…

大文件分片上传、分片进度以及整体进度、断点续传(一)

大文件分片上传 效果展示 前端 思路 前端的思路&#xff1a;将大文件切分成多个小文件&#xff0c;然后并发给后端。 页面构建 先在页面上写几个组件用来获取文件。 <body><input type"file" id"file" /><button id"uploadButton…

VisionPro---PatMaxTool工具使用

CogPMAlignTool PatMax是一种图案位置搜索技术&#xff08;识别定位&#xff09;&#xff0c;PatMax图案不依赖于像素格栅&#xff0c;是基于边缘特征的模板匹配而不是基于像素的模板匹配&#xff0c;支持图像中特征的旋转与缩放&#xff0c;边缘特征表示图像中不同区域间界限…

Redis-安装、配置和修改配置文件、以及在Ubuntu和CentOS上设置Redis服务的开机启动和防火墙设置,以及客户端连接。

目录 1. Redis简介 2. 离线安装 2.1 准备工作 2.2 解压、安装 2.3 修改配置文件 2.4 redis服务与关闭 2.5 redis服务的开机启动 2.5.1 Ubuntu上的配置 2.5.2 centos上的配置 3. 在线安装 4. 设置防火墙 5. 客户端连接 1. Redis简介 Redis 是完全开源免费的&#x…

配置typroa上传图片到gitee

在typora这个位置下载插件 在picgo.exe文件夹下输入cmd 打开命令行输入如下命令安装相关插件 .\picgo install gitee-uploader .\picgo install super-prefix 之后按照官方文档更改相关配置 官方文档参考 https://picgo.github.io/PicGo-Core-Doc 博客参考&#xff1a;…

JSP学习资源网站系统eclipse定制开发mysql数据库BS模式java编程

一、源码特点 java 学习资源网站系统是一套完善的web设计系统 &#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,eclipse开发&#xff0c;数据库为Mysql5.0&#xff0c;…