HtmlAgilityPack是一个基于C#的第三方免费开源的微型html解析类库,主要用于解析html文档。虽然是一个轻量型的html解析类库,但它的功能却不弱,为解析DOM已经提供了足够强大的功能支持,在HtmlAgilityPack中最常用的基础类其实不多,对解析DOM来说,也就只有HtmlWeb、HtmlDocument、HtmlNode这两个常用的类,还有一个 HtmlNodeCollection集合类不怎么常用,接下来我们介绍下这个类库如何使用,首先我们在Nuget中搜索“HtmlAgilityPack”进行安装,安装代码如下。

Install-Package HtmlAgilityPack -Version 1.11.46

HtmlAgilityPack包安装

属性说明

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

方法说明

方法说明
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文档保存到指定的路径

填写目标页面或者网站地址,获取指定DOM树下的元素;如果目标网站做了反爬虫,那就需要去代理网站购买代理然后动态切换代理,还有就是可以每次访问时都动态更换UA标识,计算机标识等手段来规避反爬虫机制;话不多说贴上示例代码,目标网站是以本博客的地址作为对象爬取网页信息,做了一个小小的示例。

internal class Program
    {
        private static void Main(string[] args)
        {
            //创建HtmlWeb对象并设置随机UA
            var web = new HtmlWeb()
            {
                UserAgent = Sayaka.Common.ProviderFakeUserAgent.RandomComputer
            };

            //加载目标网页,获取DOM树,代理信息根据目标网站而定,如果目标网站做了反扒封IP之类的,那就需要去代理网站购买代理,然后在此动态切换代理
            HtmlAgilityPack.HtmlDocument doc = web.Load("https://www.sotoolbox.com", "代理ip(选填)", 代理端口(选填), "代理账户(选填)", "代理密码(选填)");
            //获取ul标签class为nav nav-sub dk下面的li标签集合;按DOM结构大概拼下来就行
            var aList = doc.DocumentNode.SelectNodes("//ul[@class='nav nav-sub dk']//li//a");

            foreach (var tb in aList)
            {
                Console.WriteLine(tb.LastChild.InnerText.Replace("\n", "").Replace("\t", ""));
            }
            Console.ReadLine();
        }
    }

另外,还有一种网页结构经常遇到,就是网页table表格抓爬。在此写一下示例方便大家参考,示例代码如下

internal class Program
    {
        private static void Main(string[] args)
        {
            //创建HtmlWeb对象并设置随机UA
            var web = new HtmlWeb()
            {
                UserAgent = Sayaka.Common.ProviderFakeUserAgent.RandomComputer
            };

            //加载目标网页,获取DOM树
            HtmlAgilityPack.HtmlDocument doc = web.Load("https://price.21food.cn/market/"/*由于上面写过示例了,代理配置就不写了*/);
            var docList = doc.DocumentNode.SelectNodes("//div[@class='sjs_top_tv1']//div[@class='sjs_top_cent_erv']//ul//li//table");
            foreach (var tb in docList)
            {
                var tdList = tb.SelectNodes("tr//td");
                var market = tdList[0].InnerText;
                var city = tdList[1].InnerText;
                var product = tdList[2].InnerText.Replace(" ", "").Replace("\t", "").Replace("\r", "").Replace("\n", "");
                var create_time = tdList[3].InnerText;
                Console.WriteLine($"市场:{market}");
                Console.WriteLine($"所在地:{city}");
                Console.WriteLine($"产品:{product}");
                Console.WriteLine($"报价日期:{create_time}");
                break;
            }
            Console.ReadLine();
        }
    }

最后,随机生成UA类库也能够在Nuget上找到,名字叫FakeUserAgent,安装代码如下

Install-Package FakeUserAgent -Version 1.0.2
最后修改:2022 年 09 月 30 日
如果觉得我的文章对你有用,请随意赞赏