广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C#使用HtmlAgilityPack组件解析html文档
  • 201
分享到

C#使用HtmlAgilityPack组件解析html文档

2024-04-02 19:04:59 201人浏览 安东尼
摘要

一、htmlAgilityPack介绍 参考: GitHub:https://github.com/zzzprojects/html-agility-pack/releases 官网

一、htmlAgilityPack介绍

参考:

GitHubhttps://github.com/zzzprojects/html-agility-pack/releases

官网:Https://html-agility-pack.net/

https://www.nuget.org/packages/HtmlAgilityPack/

HtmlAgilityPack(以下简称HAP)是一个基于.Net的、第三方免费开源的微型类库,主要用于在服务器端解析html文档。

HtmlAgilityPack为网页提供了标准的DOM api和XPath导航 。使用WEBBrowser和HttpWebRequest下载的网页可以用Html Agility Pack来解析。

Xpath表达式的参考文档可见:XML基本概念XPath、XSLT与XQuery函数介绍

二、属性和方法

HtmlAgilityPack中的Htmlnode类与XmlNode类差不多,HtmlDocument类与XmlDocument类差不多。

参考:C#下使用XmlDocument操作XML

1、属性:

  • OwnerDocument节点所在的HtmlDocument文档
  • Attributes 获取节点的属性集合
  • ParentNode:获取该节点的父节点
  • ChildNodes获取子节点集合(包括文本节点)
  • FirstChild 获取第一个子节点
  • LastChild 获取最后一个子节点
  • Id 获取该节点的Id属性
  • NameHtml元素名
  • NodeType 获取该节点的节点类型
  • InnerHtml 获取该节点的Html代码
  • InnerText 获取该节点的内容,与InnerHtml不同的地方在于它会过滤掉Html代码,而InnerHtml是连Html代码一起输出
  • OuterHtml 整个节点的代码
  • PreviousSibling: 获取前一个兄弟节点
  • NextSibling 获取下一个兄弟节点
  • HasAttributes 判断该节点是否含有属性
  • HasChildNodes 判断该节点是否含有子节点
  • HasClosingAttributes  判断该节点的关闭标签是否含有属性(</xxx class="xxx">)
  • Closed该节点是否已关闭(</xxx>)
  • ClosingAttributes在关闭标签的属性集合StreamPosition: 该节点位于整个Html文档的字符位置
  • XPath: 根据节点返回该节点的XPath

2、方法:

  • Load (string path) 从路径中加载一个文档
  • SelectNodes (string xpath) 根据XPath获取一个节点集合
  • SelectSingleNode (string xpath) 根据XPath获取唯一的一个节
  • Ancestors () 返回此元素的所有上级节点的集合。
  • DescendantNodes () 获取所有子代节点
  • Element (string name) 根据参数名获取一个元素
  • Elements (string name) 根据参数名获取匹配的元素集合
  • GetAttributeValue(string name, bool def) 帮助方法,用来获取此节点的属性的值(布尔类型)。如果未找到该属性,则将返回默认值。
  • ChildAttributes(string name) 获取所有子元素的属性(参数名要与元素名匹配)
  • IsEmptyElement(string name) 确定是否一个空的元素节点。
  • IsOverlappedClosingElement(string text) 确定是否文本对应于一个节点可以保留重叠的结束标记。
  • AppendChild(HtmlNode newChild) 将参数元素追加到为调用元素的子元素(追加在最后)
  • PrependChild(HtmlNode newChild) 将参数中的元素作为子元素,放在调用元素的最前面
  • Clone() 本节点克隆到一个新的节点
  • CopyFrom(HtmlNode node) 创建重复的节点和其下的子树。
  • CreateNavigator() 返回的一个对于此文档的XPathNavigator
  • CreateNode(string html) 静态方法,允许用字符串创建一个新节点
  • CreateRootNavigator() 创建一个根路径的XPathNavigator
  • InsertAfter(HtmlNode newChild, HtmlNode refChild) 将一个节点插入到第二个参数节点的后面,与第二个参数是兄弟关系
  • InsertBefore(HtmlNode newChild, HtmlNode refChild) 将一个节点插入到第二个参数节点的后面,与第二个参数是兄弟关系
  • Remove() 从父集合中移除调用节点
  • SetAttributeValue(string name, string value) 设置调用节点的属性
  • WriteContentTo() 将该节点的所有子级都保存到一个字符串中。
  • WriteTo() 将当前节点保存到一个字符串中。
  • Save(string filename) 将HTML文档保存到指定的路径

三、用法举例

下面是几个简单使用说明:

1、获取网页title:

doc.DocumentNode.SelectSingleNode("//title").InnerText;//XPath中:“//title”表示所有title节点。SelectSingleNode用于获取满足条件的唯一的节点。

2、获取所有的超链接:

doc.DocumentNode.Descendants("a")

3、获取name为kw的input,也就是相当于getElementsByName():

var kwBox = doc.DocumentNode.SelectSingleNode("//input[@name='kw']");

示例:

private void FORM1_Load(object sender, EventArgs e)
{
    List<Result> list = new List<Result>();
    HtmlWeb htmlWeb = new HtmlWeb();
    htmlWeb.OverrideEncoding = Encoding.UTF8;//编码,这里网上有些很多写法都不正确
    HtmlAgilityPack.HtmlDocument htmlDoc = htmlWeb.Load(@http://www.cnblogs.com/);
    //选择博客园首页文章列表
    htmlDoc.DocumentNode.SelectNodes("//div[@id='post_list']/div[@class='post_item']").//双斜杠“//”表示从跟节点开始查找
        AsParallel().ToList().ForEach(ac =>
        {
            //抓取图片,因为有空的,所以拿变量存起来
            HtmlNode node = ac.SelectSingleNode(".//p[@class='post_item_summary']/a/img");
            list.Add(new Result
            {
                url = ac.SelectSingleNode(".//a[@class='titlelnk']").Attributes["href"].Value,
                title = ac.SelectSingleNode(".//a[@class='titlelnk']").InnerText,
                //图片如果为空,显示默认图片
                img = node == null ? "http ://www.cnblogs.com//Content/img/avatar.png" : node.Attributes["src"].Value,
                content = ac.SelectSingleNode(".//p[@class='post_item_summary']").InnerText
            });
        });

    foreach (Result item in list)
    {
        this.listBox1.Items.Add(item.title);
    }
}
/// <summary>
/// 页面抓取结果
/// </summary>
public class Result
{
    /// <summary>
    /// 链接
    /// </summary>
    public string url { get; set; }
    /// <summary>
    /// 标题
    /// </summary>
    public string title { get; set; }
    /// <summary>
    /// 头像地址
    /// </summary>
    public string img { get; set; }
    /// <summary>
    /// 正文内容
    /// </summary>
    public string content { get; set; }
}

示例2:下载微软文档

using HtmlAgilityPack;
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;

namespace ConsoleApp4
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            //网页地址:
            string Url = "https://docs.microsoft.com/zh-cn/aspnet/mvc/overview/getting-started/getting-started-with-ef-using-mvc/implementing-inheritance-with-the-entity-framework-in-an-asp-net-mvc-application";

            List<string> list = new List<string>(); ;
            HtmlWeb htmlWeb = new HtmlWeb();
            htmlWeb.OverrideEncoding = Encoding.UTF8;

            HtmlDocument htmlDoc = htmlWeb.Load(Url);

            HtmlNode node = htmlDoc.DocumentNode.SelectSingleNode("//main[@id='main']");

            //去掉英文翻译
            var a = node.SelectNodes("//span[@class='sxs-lookup']");
            foreach (HtmlNode b in a)

            {
                b.Remove();
            }

            string src = "";
            //图片相对路径改成绝对路径
            var imgNode = node.SelectNodes("//img[@data-linktype='relative-path']");
            foreach (HtmlNode node1 in imgNode)
            {
                src = node1.GetAttributeValue("src", "");
                var url = new Uri(htmlWeb.ResponseUri, src);
                node1.SetAttributeValue("src", url.AbsoluteUri);
            }

            //链接路径转换
            var hrefNode = node.SelectNodes("//a[@data-linktype='relative-path']|//a[@data-linktype='absolute-path']");
            foreach (HtmlNode node1 in hrefNode)
            {
                src = node1.GetAttributeValue("href", "");
                var url = new Uri(htmlWeb.ResponseUri, src);
                node1.SetAttributeValue("href", url.AbsoluteUri);
            }

            //找到所有的H2标签,然后加上顺序。
            var h2Node = node.SelectNodes("//h2");
            var arr = new string[] { "一", "二", "三", "四", "五", "六", "七", "八", "九", "十", "十一", "十二", "十三", "十四", "十五", "十六", "十七", "十八", "十九", "二十" };
            if (h2Node != null)
            {
                for (int i = 0; i < h2Node.Count; i++)
                {
                    h2Node[i].InnerHtml = arr[i] + "、" + h2Node[i].InnerHtml;
                    //找到所有的H3标签,然后加上顺序。

                    var h3Node = h2Node[i].SelectNodes("following-sibling::h2|following-sibling::h3");
                    if (h3Node is null)
                        break;
                    for (int j = 0; j < h3Node.Count; j++)
                    {
                        if (h3Node[j].Name == "h2")
                            break;
                        else
                            h3Node[j].InnerHtml = (j + 1) + "、" + h3Node[j].InnerHtml;
                    }
                }
            }
            HtmlNode myNOde = htmlDoc.CreateElement("div");

            //去掉前面无用的部分
            var OK = node.SelectNodes("nav[1]/following-sibling::*");
            myNOde.AppendChildren(OK);

            //添加原文连接:
            HtmlNode nodeOriUrl = htmlDoc.CreateElement("p");
            nodeOriUrl.InnerHtml = "原文:<a href='" + htmlWeb.ResponseUri + "'>" + htmlWeb.ResponseUri + "</a>";
            myNOde.PrependChild(nodeOriUrl);

            //写入到本地文件
            TextWriter wr = new StreamWriter(@"aa.html");
            myNOde.WriteTo(wr);
            wr.Close();
        }
    }
}

四、Fizzler.Systems.HtmlAgilityPack:

Hazz为HTMLAgilityPack实现CSS选择器。它基于Fizzler,一个通用的CSS选择器解析器和生成器库。

Hazz以前称为Fizzler.Systems.HtmlAgilityPack。

// Load the document using HTMLAgilityPack as normal
var html = new HtmlDocument();
html.LoadHtml(@"
  <html>
      <head></head>
      <body>
        <div>
          <p class='content'>Fizzler</p>
          <p>CSS Selector Engine</p></div>
      </body>
  </html>");

// Fizzler for HtmlAgilityPack is implemented as the
// QuerySelectorAll extension method on HtmlNode

var document = html.DocumentNode;

// yields: [<p class="content">Fizzler</p>]
document.QuerySelectorAll(".content");

// yields: [<p class="content">Fizzler</p>,<p>CSS Selector Engine</p>]
document.QuerySelectorAll("p");

// yields empty sequence
document.QuerySelectorAll("body>p");

// yields [<p class="content">Fizzler</p>,<p>CSS Selector Engine</p>]
document.QuerySelectorAll("body p");

// yields [<p class="content">Fizzler</p>]
document.QuerySelectorAll("p:first-child");

到此这篇关于C#使用HtmlAgilityPack组件解析html文档的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持编程网。

--结束END--

本文标题: C#使用HtmlAgilityPack组件解析html文档

本文链接: https://www.lsjlt.com/news/151404.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C#使用HtmlAgilityPack组件解析html文档
    一、HtmlAgilityPack介绍 参考: GitHub:https://github.com/zzzprojects/html-agility-pack/releases 官网...
    99+
    2022-11-13
  • C#使用AngleSharp库解析html文档
    一、简介 AngleSharp:https://github.com/AngleSharp/AngleSharp AngleSharp是一个.NET库,使您能够解析基于尖括号的超文本...
    99+
    2022-11-13
  • C#如何使用AngleSharp库解析html文档
    这篇“C#如何使用AngleSharp库解析html文档”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C#如何使用Angle...
    99+
    2023-07-02
  • 解析如何自动化生成vue组件文档
    目录一、现状二、社区解决方案2.1、业务梳理三、技术方案3.1、Vue文件解析3.2、信息提取3.2.1、可直接获取的信息3.2.2、需要约定的信息四、总结五、展望一、现状 Vue框...
    99+
    2022-11-12
  • Python 文档解析lxml库的使用详解
    目录1.lxml库简介2.lxml库方法介绍3.代码实例1.lxml库简介 lxml 是 Python 常用的文档解析库,能够高效地解析 HTML/XML 文档,常用于 Python...
    99+
    2022-11-11
  • 怎么使用POI将HTML文件转换为Word文档
    这篇文章主要讲解了“怎么使用POI将HTML文件转换为Word文档”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么使用POI将HTML文件转换为Word文档”吧!首先,我们需要在代码中添加...
    99+
    2023-07-06
  • PHP中怎么使用XMLReader解析XML文档
    PHP中怎么使用XMLReader解析XML文档,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。PHP XMLReader的代码示例如下:< PHP &...
    99+
    2023-06-17
  • Rainbond部署组件Statefulset的使用官方文档
    目录前言组件部署类型服务的“状态”处理服务的 “状态”前言 对于kubernetes老玩家而言,StatefulSet这种资源类型并不...
    99+
    2022-11-13
  • Linux系统下如何使用C++解析json文件详解
    1. 背景 工作需要,下班回来自己造轮子,记录以后查阅。 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,和xml类似,本文主要Lin...
    99+
    2022-11-12
  • 浅析Vue单文件组件与非单文件组件使用方法
    单文件组件:一个文件中只包含一个组件,后缀为.vue(常用) <template> <!-- html部分 --> <div> <p...
    99+
    2022-12-21
    Vue单文件组件 Vue非单文件组件
  • Android.mk 文件使用解析
    和你一起终身学习,这里是程序员Android 经典好文推荐,通过阅读本文,您将收获以下知识点: 一、Android.mk 简介二、Android.mk 的基本格式三、Android.mk 深入学习一四、 Android.mk ...
    99+
    2023-09-18
    android
  • QT .pro文件使用解析
    目录1.pro文件的作用2.一个简单的示例3.指定链接的三方库4.编译为库5.指定debug,release,win32平台还是别的平台6.判断编译环境是x86架构还是arm架构7....
    99+
    2022-11-13
  • vue文件使用iconfont解析
    目录vue使用iconfont项目中正确使用iconfontvue使用iconfont 1、导入字体文件到assets中 2、main.js 导入 import '@/assets...
    99+
    2022-11-13
  • 一键将Word文档转成Vue组件mammoth的应用详解
    目录正文mammoth.js 的不足改造解析 ASTAST 节点处理 AST 节点代码格式化与生成总结正文 在开发后台管理系统的过程中,经常有这样的需求:将 Word 文档(比如用...
    99+
    2023-02-01
    Word转成Vue组件mammoth Word转成Vue组件
  • Jprofile解析dump文件使用详解
    1 Jprofile简介 官网 下载对应的系统版本即可 性能查看工具JProfiler,可用于查看java执行效率,查看线程状态,查看内存占用与内存对象,还可以分析dump日志. 2 功能简介 选择attach to a...
    99+
    2015-06-05
    Jprofile解析dump文件使用详解
  • C#使用SharpZipLib压缩解压文件
    一、介绍 SharpZipLib是一个完全由C#编写的ZIP,GZIP,Tar和BZIP2 Library,可以方便的支持这几种格式的压缩和解压缩。 https://github.c...
    99+
    2022-11-13
  • 详解android使用SAX解析XML文件
    解析XML的方式有很多种,大家比较熟悉的可能就是DOM解析。 DOM(文件对象模型)解析:解析器读入整个文档,然后构建一个驻留内存的树结构,然后代码就可以根据DOM接口来操作这...
    99+
    2022-06-06
    XML sax解析xml xml文件 sax Android
  • C/C++ Qt TableDelegate 自定义代理组件使用详解
    TableDelegate 自定义代理组件的主要作用是对原有表格进行调整,例如默认情况下Table中的缺省代理就是一个编辑框,我们只能够在编辑框内输入数据,而有时我们想选择数据而不是...
    99+
    2022-11-12
  • java使用dom4j生成与解析xml文档的方法示例
    本文实例讲述了java使用dom4j生成与解析xml文档的方法。分享给大家供大家参考,具体如下:xml是一种新的数据格式,主要用于数据交换。我们所用的框架都有涉及到xml。因此解析或生成xml对程序员也是一个技术难点。这里就用dom4j来生...
    99+
    2023-05-31
    java dom4j xml
  • 使用C/C++读写.mat文件的方法详解
    目录一、创建工程并添加测试代码二、修改CmakeLists文件三、添加环境变量四、令人头秃的错误五、运行结果总结最近需要使用C++来处理matlab生成的数据, 参考了网上一些博客,...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作