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


    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的功能远远不止本文所描述的这些,更多的功能,可能需要有更深入的需求才会用到,

    有不懂或者需要交流的大佬们,可以加我的QQ:862640563 QQ群:545594312

  • 相关阅读:
    _allow_resetlogs_corruption打开数据库
    增量备份恢复DATAGUARD(出现gap并后续有新增数据文件,主从数据文件路径一致)
    dataguard环境破坏后采用rman备份集重新部署
    表空间数据文件迁移到另外的位置(backup as copy tablespace)
    pl/sql无法登录12c问题
    ORA-00845: MEMORY_TARGET not supported on this system
    dataguard主库添加的数据文件路径在从库不存在
    12c expdp
    表进行加密(redact)实验
    创建触发器启动pdb
  • 原文地址:https://www.cnblogs.com/boxrice/p/11670438.html
Copyright © 2020-2023  润新知