HtmlAgilityPack应该算是.Net下最好用的html解析库了。
因为最近帮朋友采集一些数据,在nuget里面搜索了好几个库,最后决定就用HtmlAgilityPack。并简单的记录下使用的姿势。
直接使用nuget包安装
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等操作。
当然简单的使用,使用HtmlWeb就差不多了。
2.解析网页
第一步拿到的htmlDocument对象,里面提供了很多操作。
举个栗子,比如我们要获取网页的文章的作者,直接在Chrome中右键->审查元素->elements->右键->Copy->Copy Xpath
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的功能远远不止本文所描述的这些,更多的功能,可能需要有更深入的需求才会用到,