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

HtmlAgilityPack 操作详解

目录

1.安装 HtmlAgilityPack

2. 示例 HTML

 3. 使用 HtmlAgilityPack 进行 HTML 解析与操作

 4. 代码详解

1.加载html文档

2.选择元素

3. 提取属性

4.修改属性 

5.常用的几种获取元素的 XPath 写法


HtmlAgilityPack:

  • 轻量且高效,适合进行常规的 HTML 解析。
  • 由于其轻量化设计,在只需简单提取或修改元素内容时,HtmlAgilityPack 会显得更快。
  • 对于层级较深或大规模的 HTML 文档,HtmlAgilityPack 也会处理得较为流畅。
  • 文件大小较小,功能单一,适用于解析 HTML 和使用 XPath 查询。
  • 没有内置对 CSS 选择器的支持,需要通过额外库扩展(如 Fizzler)。
1.安装 HtmlAgilityPack

通过 NuGet 包管理器安装 HtmlAgilityPack: 

2. 示例 HTML

假设我们有以下 HTML 内容,需要解析和操作: 

 <!DOCTYPE html><html><head><title>HtmlAgilityPack Example</title><style>.highlight { color: yellow; }#main { background-color: #f0f0f0; }</style></head><body><h1 id='main-heading' class='highlight'>Welcome to HtmlAgilityPack</h1><p>This is a <span class='highlight'>simple</span> example.</p><a href='https://example.com' target='_blank'>Visit Example.com</a><ul id='items'><li class='item'>Item 1</li><li class='item'>Item 2</li><li class='item'>Item 3</li></ul><input type='text' id='username' value='JohnDoe' /><input type='password' id='password' /></body></html>
 3. 使用 HtmlAgilityPack 进行 HTML 解析与操作

 以下是一个详细的 C# 示例,展示如何使用 HtmlAgilityPack 进行各种操作:

using HtmlAgilityPack;
using System;
using System.Linq;class Program
{static void Main(string[] args){// 示例 HTML 内容string html = @"<!DOCTYPE html><html><head><title>HtmlAgilityPack Example</title><style>.highlight { color: yellow; }#main { background-color: #f0f0f0; }</style></head><body><h1 id='main-heading' class='highlight'>Welcome to HtmlAgilityPack</h1><p>This is a <span class='highlight'>simple</span> example.</p><a href='https://example.com' target='_blank'>Visit Example.com</a><ul id='items'><li class='item'>Item 1</li><li class='item'>Item 2</li><li class='item'>Item 3</li></ul><input type='text' id='username' value='JohnDoe' /><input type='password' id='password' /></body></html>";// 1. **加载 HTML 文档**HtmlDocument document = new HtmlDocument();document.LoadHtml(html);// 2. **选择元素**// 使用 XPath 选择所有具有 class 'highlight' 的元素var highlights = document.DocumentNode.SelectNodes("//*[@class='highlight']");Console.WriteLine("Elements with class 'highlight':");foreach (var elem in highlights){Console.WriteLine($"- <{elem.Name}>: {elem.InnerText}");}// 使用 ID 选择器选择特定元素var mainHeading = document.GetElementbyId("main-heading");if (mainHeading != null){Console.WriteLine($"\nElement with ID 'main-heading': {mainHeading.InnerText}");}// 选择所有 <a> 标签var links = document.DocumentNode.SelectNodes("//a");Console.WriteLine("\nAll <a> elements:");foreach (var link in links){Console.WriteLine($"- Text: {link.InnerText}, Href: {link.GetAttributeValue("href", "")}, Target: {link.GetAttributeValue("target", "")}");}// 选择所有具有 class 'item' 的 <li> 元素var items = document.DocumentNode.SelectNodes("//li[@class='item']");Console.WriteLine("\nList items with class 'item':");foreach (var item in items){Console.WriteLine($"- {item.InnerText}");}// 选择特定类型的输入元素var textInput = document.DocumentNode.SelectSingleNode("//input[@type='text']");var passwordInput = document.DocumentNode.SelectSingleNode("//input[@type='password']");Console.WriteLine($"\nText Input Value: {textInput.GetAttributeValue("value", "")}");Console.WriteLine($"Password Input Value: {passwordInput.GetAttributeValue("value", "")}");// 3. **提取和修改属性**// 获取第一个链接的 href 属性string firstLinkHref = links.First().GetAttributeValue("href", "");Console.WriteLine($"\nFirst link href: {firstLinkHref}");// 修改第一个链接的 href 属性links.First().SetAttributeValue("href", "https://newexample.com");Console.WriteLine($"Modified first link href: {links.First().GetAttributeValue("href", "")}");// 4. **提取和修改文本内容**// 获取第一个段落的文本内容var firstParagraph = document.DocumentNode.SelectSingleNode("//p");Console.WriteLine($"\nFirst paragraph text: {firstParagraph.InnerText}");// 修改第一个段落的文本内容firstParagraph.InnerHtml = "This is an <strong>updated</strong> example.";Console.WriteLine($"Modified first paragraph HTML: {firstParagraph.InnerHtml}");// 5. **操作样式**// 获取元素的 class 属性string h1Classes = mainHeading.GetAttributeValue("class", "");Console.WriteLine($"\nMain heading classes: {h1Classes}");// 添加一个新的 classmainHeading.SetAttributeValue("class", h1Classes + " new-class");Console.WriteLine($"Main heading classes after adding 'new-class': {mainHeading.GetAttributeValue("class", "")}");// 移除一个 class (手动实现,HtmlAgilityPack 不支持内置的 class 操作)h1Classes = mainHeading.GetAttributeValue("class", "").Replace("highlight", "").Trim();mainHeading.SetAttributeValue("class", h1Classes);Console.WriteLine($"Main heading classes after removing 'highlight': {mainHeading.GetAttributeValue("class", "")}");// 6. **遍历和查询 DOM**// 遍历所有子节点的标签名Console.WriteLine("\nChild elements of <body>:");var bodyChildren = document.DocumentNode.SelectSingleNode("//body").ChildNodes;foreach (var child in bodyChildren){if (child.NodeType == HtmlNodeType.Element){Console.WriteLine($"- <{child.Name}>");}}// 查找包含特定文本的元素var elementsWithText = document.DocumentNode.SelectNodes("//*[contains(text(), 'simple')]");Console.WriteLine("\nElements containing the text 'simple':");foreach (var elem in elementsWithText){Console.WriteLine($"- <{elem.Name}>: {elem.InnerText}");}// 7. **生成和输出修改后的 HTML**string modifiedHtml = document.DocumentNode.OuterHtml;Console.WriteLine("\nModified HTML:");Console.WriteLine(modifiedHtml);}
}
 4. 代码详解
1.加载html文档
HtmlDocument document = new HtmlDocument();
document.LoadHtml(html);
2.选择元素
  • 使用 XPath 选择所有具有相同特征的元素集合 .SelectNodes("XPath");
    var elements = document.DocumentNode.SelectNodes("//*[@class='class']");
  • 通过 XPath 选择具有独立性的单一元素 .SelectSingleNode("XPath");
    var div = document.DocumentNode.SelectSingleNode("//div[@id='title-content']");
  • 使用 ID 选择器选择特定元素 .GetElementbyId("id");
    var element = document.GetElementbyId("id");
  • 获取子节点(注意这里是直接子节点集合,即第一级的子节点。不包括更深层次的子孙节点。).ChildNodes;

    var bodyChildren = document.DocumentNode.SelectSingleNode("//body").ChildNodes;
  • 获取元素的第一个子节点 .First();
    var firstChildNode = element.First();

3. 提取属性

假设我们要对下面这个 element 进行操作

var element = document.GetElementbyId("id");
  • 提取元素内部 html
    string innerHtml = element.InnerHtml;
  • 提取含元素自身的 html
    string outerHtml = element.OuterHtml;
  • 提取文本
    string text= element.InnerText;
  • 提取属性
    string _value = element.GetAttributeValue("value", "");
  • 提取 href
    string href = element.GetAttributeValue("href", "");
4.修改属性 
  • 修改 href

    element.SetAttributeValue("href", "https://newexample.com");
  • 添加 class 
     element.SetAttributeValue("class", oldClasses + " new-class");
  •  修改 class
    // 移除一个 class (手动实现,HtmlAgilityPack 不支持内置的 class 操作)
    newClasses = element.GetAttributeValue("class", "").Replace("highlight", "").Trim();
    element.SetAttributeValue("class", newClasses);
5.常用的几种获取元素的 XPath 写法
  • 通过 id 获取
    var element = document.DocumentNode.SelectSingleNode("//*[@id='id']");
  • 通过 class 获取
    var element = document.DocumentNode.SelectNodes("//*[@class='class']");
  • 通过匹配文本获取
    var elementsWithText = document.DocumentNode.SelectNodes("//*[contains(text(), 'simple')]");
  • 通过 class 和 匹配文本 相结合获取
    var elements = doc.DocumentNode.SelectNodes("//span[@class='title-content-title' and contains(text(), '包含的文本')]");

相关文章:

HtmlAgilityPack 操作详解

目录 1.安装 HtmlAgilityPack 2. 示例 HTML 3. 使用 HtmlAgilityPack 进行 HTML 解析与操作 4. 代码详解 1.加载html文档 2.选择元素 3. 提取属性 4.修改属性 5.常用的几种获取元素的 XPath 写法 HtmlAgilityPack&#xff1a; 轻量且高效&#xff0c;适合进行常规的 H…...

基于SSM医院门诊互联电子病历管理系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;医生管理&#xff0c;项目分类管理&#xff0c;项目信息管理&#xff0c;预约信息管理&#xff0c;检查信息管理&#xff0c;系统管理 用户账号功能包括&#xff1a;系统首页&…...

【读书笔记/深入理解K8S】集群网络

前言 上一章讲了集群控制器的一个大概的原理&#xff0c;这一章讲一下集群网络。网络是集群通信的载体&#xff0c;因为该书是阿里云团队出品的&#xff0c;所以也以阿里云的集群网络方案为例&#xff0c;其他云厂商的网络集群方案一般来说也大同小异。所以通过本章的学习&…...

【专有网络VPC】连接公网

通过ECS实例固定公网IP、弹性公网IP、NAT网关、负载均衡使专有网络中的云资源可以访问公网&#xff08;Internet&#xff09;或被公网访问。 概述 专有网络是您自定义的云上私有网络。专有网络中的云资源默认无法访问公网&#xff0c;也无法被公网访问。您可以通过配置ECS实例…...

论文 | Legal Prompt Engineering for Multilingual Legal Judgement Prediction

这篇文章探讨了如何利用“法律提示工程”&#xff08;LPE&#xff09;来指导大型语言模型&#xff08;LLM&#xff09;进行多语言法律判决预测&#xff08;LJP&#xff09;。主要内容&#xff1a; LPE 的概念&#xff1a; LPE 是指通过设计特定的提示&#xff08;promp…...

国科安芯抗辐照MCU和CANFD芯片发布

国科安芯科技有限公司近期发布了两款重要的芯片产品&#xff1a;抗辐照MCU芯片和抗辐照CANFD芯片。这两款芯片的发布标志着国科安芯在高性能、高安全性芯片产品研制方面取得了显著进展&#xff0c;特别是在抗辐照技术领域。 1. 抗辐照MCU芯片&#xff1a;国科安芯研发的AS32A4…...

C++ 并发专题 - 无锁数据结构(概述)

一&#xff1a;概述&#xff1a; 无锁数据结构是一种在多线程环境中实现线程安全的结构&#xff0c;它允许多个线程在没有传统锁机制的情况下并发访问和修改数据。这种设计的目标是提高程序的性能和响应性&#xff0c;避免锁竞争和上下文切换的开销。 二&#xff1a;原理&…...

NLP领域的经典算法和模型

在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;经典算法和模型众多&#xff0c;它们在不同任务中发挥着重要作用。以下是一些NLP领域的经典算法和模型的详细介绍&#xff1a; 一、基础模型 词袋模型&#xff08;Bag of Words&#xff0c;BoW&#xff09; 原理&a…...

提升安全上网体验:Windows 11 启用 DOH(阿里公共DNS)

文章目录 阿里公共 DNS 介绍免费开通云解析 DNS 服务Windows 编辑 DNS 设置配置 IPv4配置 IPv6 路由器配置 DNS 阿里公共 DNS 介绍 https://alidns.com/ 免费开通云解析 DNS 服务 https://dnsnext.console.aliyun.com/pubDNS 开通服务后&#xff0c;获取 DOH 模板&#xff0…...

论文概览 |《Journal of Transport Geography》2024.10 Vol.120

本次给大家整理的是《Journal of Transport Geography》杂志2024年9月第120卷的论文的题目和摘要&#xff0c;一共包括17篇SCI论文&#xff01; 论文1 Modelling scenarios in planning for future employment growth in Stockholm 斯德哥尔摩未来就业增长规划情景建模 【摘要…...

yum不能使用: cannot find a valid baseurl for repo: base/7/x86_64

使用yum命令时报错&#xff1a; 原因&#xff1a; CentOS 已经停止维护的问题。2020 年 12 月 8 号&#xff0c;CentOS 官方宣布了停止维护 CentOS Linux 的计划&#xff0c;并推出了 CentOS Stream 项目&#xff0c;CentOS Linux 8 作为 RHEL 8 的复刻版本&#xff0c;生命周期…...

什么品牌的护眼台灯比较好?五款护眼效果比较明显的护眼台灯

在当今信息爆炸的时代背景下&#xff0c;挑选一款真正符合个人需求的护眼台灯&#xff0c;确实是一项不小的挑战。市场上品牌众多、型号繁杂&#xff0c;功能特点各不相同&#xff0c;价格区间也相当广泛&#xff0c;许多消费者在选购时往往感到迷茫不已。当大家询问“什么品牌…...

HTML 表单设计与验证

创建 HTML 表单的步骤如下&#xff1a; 使用 <form> 标签来创建表单&#xff0c;<form> 标签有一个 action 属性&#xff0c;用于指定表单提交的目标 URL。 在 <form> 标签内部&#xff0c;使用 <input> 标签来创建输入框。<input> 标签有一个 …...

qt QDialog详解

1、概述 QDialog是Qt框架中用于创建对话框的类&#xff0c;它继承自QWidget。QDialog提供了一个模态或非模态的对话框&#xff0c;用于与用户进行交互。模态对话框会阻塞其他窗口的输入&#xff0c;直到用户关闭该对话框&#xff1b;而非模态对话框则允许用户同时与多个窗口进…...

supervisor服务“Exited too quickly“解决方案

【初始问题】supervisor创建一个守护进程&#xff0c;老是提示启动失败 【结论】进程执行后&#xff0c;短时间就断开了 Ⅰ 问题分析 supervisor开启进程守护失败了&#xff0c;查看下进程执行记录&#xff0c;显示这个进程的指令执行报错了 接下来&#xff0c;查看下superv…...

动态规划 —— 路径问题-地下城游戏

1. 地下城游戏 题目链接&#xff1a; 174. 地下城游戏 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/dungeon-game/description/ 2. 算法原理 状态表示&#xff1a;以莫一个位置位置为结尾或者以莫一个位置为起点 dp[i&#xff0c;j]表示&#xff1a…...

沈阳乐晟睿浩科技有限公司抖音小店短视频时代的电商蓝海

在数字化浪潮席卷全球的今天&#xff0c;电子商务以其独特的魅力和无限的潜力&#xff0c;成为了推动经济发展的新引擎。作为这一领域的佼佼者&#xff0c;沈阳乐晟睿浩科技有限公司凭借其深厚的行业积淀与创新精神&#xff0c;正逐步成为众多商家在抖音小店平台上腾飞的强大助…...

ubuntu20.04安装ros与rosdep

目录 前置配置 配置apt清华源 配置ros软件源 添加ros安装源&#xff08;中科大软件源&#xff09; 设置秘钥 更新源 ros安装 安装ros 初始化 rosdep 更新 rosdep 设置环境变量 安装 rosinstall 安装验证 启动海龟仿真器 操控海龟仿真器 rosdep安装更新 安装 使用…...

推理加速papers

《A Survey on Efficient Inference for Large Language Models》2024-07 1. Q、K、V的计算&#xff0c;都是矩阵乘法&#xff1b; 2. prefilling阶段&#xff0c;每次计算&#xff0c;Q是N个向量一起&#xff1b;decoding阶段&#xff0c;每次计算&#xff0c;Q是1个向量计算&…...

【02基础】- RabbitMQ基础

目录 2- RabbitMQ2-1 介绍和安装安装 2-2 RabbitMQ 快速入门2-3 RabbitMQ 数据隔离 3- Java客户端3-1 快速入门AMQP快速入门&#x1f4d1;小结&#xff1a;SpringAMQP如何收发消息&#xff1f; 3-2 WorkQueues 任务模型案例-使用 WorkQueue 单队列绑定多消费者&#x1f4d1;小结…...

2025-06-02-IP 地址规划及案例分析

IP 地址规划及案例分析 参考资料 Plan for IP addressing - Cloud Adoption Frameworkwww.cnblogs.comimage-hosting/articles at master jonsam-ng/image-hosting 概述 在网络通信中&#xff0c;MAC 地址与 IP 地址分别位于 OSI 模型的数据链路层和网络层&#xff0c;二者协…...

自动驾驶科普(百度Apollo)学习笔记

1. 写在前面 在过去的几年里&#xff0c;自动驾驶技术取得飞速发展&#xff0c;人类社会正逐渐走向一个新时代&#xff0c;这个时代中&#xff0c;汽车不仅仅是一个交通工具&#xff0c;更是一个智能的、能够感知环境、做出决策并自主导航的机器伙伴。现在正好也从事这块的工作…...

【学习笔记】深入理解Java虚拟机学习笔记——第3章 垃圾收集器与内存分配策略

第3章 垃圾收集器与内存分配策略 3.1 概述 略 3.2 对象已死&#xff1f; “死去”即不可能以任何途径访问到 3.2.1 引用计数算法 每个对象维护一个计数器&#xff0c;引用即加1&#xff0c;引用失效便减1。 3.2.2 可达性分析算法&#xff08;主流&#xff09; 即根据GC…...

Docker 部署 Python 的 Flask项目

文章目录 一、构建运行 Docker 容器1. 查找合适镜像2.本地docker 拉取镜像3.项目配置1. python项目下生成 requirements.txt 依赖文件2. 生成Dockerfile文件3.忽略不必要文件4. 构建镜像 4. 运行容器5.测试 二、常见问题与解决方案 一、构建运行 Docker 容器 1. 查找合适镜像 …...

CppCon 2015 学习:Memory and C++ debugging at Electronic Arts

这是关于 C 游戏开发中内存接口与调试工具演进 的介绍&#xff0c;主要回顾了从早期到现在平台上的内存与调试策略变化&#xff1a; 游戏平台演进与内存接口编程风格 2000年 (PlayStation 2) 编程风格偏向嵌入式 C 风格。系统资源有限&#xff08;例如 32MB RAM&#xff09;…...

PublishSubject、ReplaySubject、BehaviorSubject、AsyncSubject的区别

python容易编辑&#xff0c;因此用pyrx代替rxjava3做演示会比较快捷。 pyrx安装命令&#xff1a; pip install rx 一、Subject&#xff08;相当于 RxJava 的 PublishSubject&#xff09; PublishSubject PublishSubject 将对观察者发送订阅后产生的元素&#xff0c;而在订阅前…...

量子计算导论课程设计 之 PennyLane环境搭建

文章目录 具体配置conda 虚拟环境配置Pennylane 正所谓&#xff0c;磨刀不误砍柴工&#xff0c;想要进行量子计算导论的课程设计&#xff0c;首先就是搭建好平台&#xff0c;推荐大家就是本地搭建&#xff0c;那么下面有三种选择 QiskitTensorFlow QuantumPennylane 具体配置…...

3 个优质的终端 GitHub 开源工具

1、Oh My Zsh Oh My Zsh 是一个帮助你管理和美化 zsh 终端的开源工具。它让你的终端更炫酷、更高效。安装后&#xff0c;你可以快速使用各种插件和主题&#xff0c;比如常见的 git 命令简化、支持多种编程语言工具等&#xff0c;每次打开终端都会有惊喜。无论你是开发者还是普…...

随机算法一文深度全解

随机算法一文深度全解 一、随机算法基础1.1 定义与核心特性1.2 算法优势与局限 二、随机算法经典案例2.1 随机化快速排序原理推导问题分析与策略代码实现&#xff08;Python、Java、C&#xff09; 2.2 蒙特卡罗方法计算 π 值原理推导问题分析与策略代码实现&#xff08;Python…...

三维图形、地理空间、激光点云渲染技术术语解析笔记

三维图形、地理空间、激光点云渲染技术术语解析笔记 code review! 文章目录 三维图形、地理空间、激光点云渲染技术术语解析笔记1. Minecraft风格的方块渲染2. Meshing&#xff08;网格化&#xff09;3. Mipmapping&#xff08;多级纹理映射&#xff09;4. Marching Cubes&…...