.Net Core下使用HtmlAgilityPack解析采集互联网数据

HtmlAgilityPack应该算是.Net下最好用的html解析库了。html

 

由于最近帮朋友采集一些数据,在nuget里面搜索了好几个库,最后决定就用HtmlAgilityPack。并简单的记录下使用的姿式。node

直接使用nuget包安装web

Install-Package HtmlAgilityPack -Version 1.11.16

 

1.下载网页

该库提供了一个下载网页的类:HtmlWeb服务器

var webGet = new HtmlWeb(); 
var document = webGet.Load(url);

若是网络正常的话,就会拿到一个HtmlDocument的对象。后面咱们全部的操做都是基于该类作的。网络

我我的更喜欢使用HttpClient来下载网页,而后使用HtmlDocument来LoadHtml。由于本身使用HTMLClient可控性更高。好比要加代理IP,随机设置UA等操做。post

固然简单的使用,使用HtmlWeb就差很少了。网站

2.解析网页

第一步拿到的htmlDocument对象,里面提供了不少操做。url

 

举个栗子,好比咱们要获取网页的文章的做者,直接在Chrome中右键->审查元素->elements->右键->Copy->Copy Xpathspa

document.DocumentNode.SelectSingleNode("Chrome复制的xpath")?.InnerText

而后就成功采集到了做者名字代理

如何解析列表?

用博客园举栗子,首页就是一个列表文章页。咱们如何获取到这个列表全部的项呢?

var nodes =  document.DocumentNode.SelectNodes("xpath表达式")

若是熟悉xpath的老哥们就知道使用双斜杠开头的,就能够获取到多项节点的结果。好比博客园的表达式为: //div[@class='post_item'],而后获取到HtmlDocument的一个集合,再解析集合的子节点,就好了!

如何删除标签?

有些文章中,会隐藏a标签来给批量采集的人下毒。

能够直接使用Descendants方法找到全部的a标签,而后删除

var aNodes = 获取到的HtmlDocument对象.DocumentNode.Descendants("a")
 foreach (var anode in aNodes.ToArray()) { anode.Remove(); }

 

若是要采集图片呢?

通常图片地址放在img的src属性上,

var imgNodes = detail.DocumentNode.Descendants("img");
            foreach (var img in imgNodes) { string imgurl = img.GetAttributeValue("src",""); }

获取到地址,就可使用HTTPClient来下载图片并保存到文件夹中

 

如何修改节点属性?

举个栗子,若是咱们把图片上传到咱们的服务器,而后要在文章中替换掉别人的图片地址,那应该怎么作呢?

 var imgNodes = detail.DocumentNode.Descendants("img");
            foreach (var img in imgNodes) { img.SetAttributeValue("src", "图片地址"); }

基本上,掌握这几点,就能处处去采集别人的网站了。

固然HtmlAgilityPack的功能远远不止本文所描述的这些,更多的功能,可能须要有更深刻的需求才会用到,

有不懂或者须要交流的大佬们,能够加个人QQ:862640563 QQ群:545594312

相关文章
相关标签/搜索