HtmlAgilityPack应该算是.Net下最好用的html解析库了。html
由于最近帮朋友采集一些数据,在nuget里面搜索了好几个库,最后决定就用HtmlAgilityPack。并简单的记录下使用的姿式。node
直接使用nuget包安装web
Install-Package HtmlAgilityPack -Version 1.11.16
该库提供了一个下载网页的类:HtmlWeb服务器
var webGet = new HtmlWeb();
var document = webGet.Load(url);
若是网络正常的话,就会拿到一个HtmlDocument的对象。后面咱们全部的操做都是基于该类作的。网络
我我的更喜欢使用HttpClient来下载网页,而后使用HtmlDocument来LoadHtml。由于本身使用HTMLClient可控性更高。好比要加代理IP,随机设置UA等操做。post
固然简单的使用,使用HtmlWeb就差很少了。网站
第一步拿到的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