热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

你没有看错,爬网页数据,C#也可以像Jquery那样

你没有看错,爬网页数据,C#也可以像Jquery那样-一:背景1.讲故事前段时间搞了一个地方性民生资讯号,资讯嘛,都是我抄你的,你抄官媒的,小市民都喜欢奇闻异事,所以就存在一个需求

一:背景

1. 讲故事

前段时间搞了一个地方性民生资讯号,资讯嘛,都是我抄你的,你抄官媒的,小市民都喜欢奇闻异事,所以就存在一个需求,如何去定向抓取奇闻异事的地方号上的新闻,其实做起来很简单,用逻辑回归即可,这篇主要讨论如何去抓取,在 C# 中大家都知道抓取通用的库是 HtmlAgilityPack,但是这个库主流的做法是采用 xpath 提取网页内容,这就让我很不爽了,毕竟不熟悉莫名的抵抗哈,像我这个年纪的码农,被 Jquery 教育了至少 5-6 年,所以必须用 类Jquery 的方式,在 python 中有 pyquery 做这件事情,那在
C# 中有没有类似的方式呢? 嘿嘿,万能的 github 上还真有。。。 就是本篇介绍的 CSQuery。

二:CSQuery

1. 安装

github的地址: https://github.com/zone117x/C... 然后在vs中 nuget 一下即可:

2. 举几个例子

一切都准备就绪了,那怎么用呢? 不着急,我以博客园举两个例子。

1) 将首页中的 友情连接 提取到

如上图,要想获取这里的 友情链接几个大字,直接用 text() 肯定是不行的,默认情况它会将所有的子节点的文本也会抓到,如下图:

那怎么处理呢? 可以用 jquery 提供的 contents 方法,然后在获取的所有子节点中判断是否有 文本节点,最后获取文本节点的内容即可,如下代码:

用js是搞定了,那用 CSQuery 代码怎么搞定呢?模仿呗,如下代码:


        static void Main(string[] args)
        {
            var jquery = CQ.CreateDocument(new WebClient().DownloadString("http://cnblogs.com"));

            var cOntent= jquery["#friend_link"].Contents().Filter((dom) =>
            {
                return dom.NodeType == NodeType.TEXT_NODE;
            }).Text();

            Console.WriteLine(content);
        }

我不知道用 xpath 提取这样的内容麻不麻烦,不过用 jquery 方式不简单,但轻车熟路。

2) 如何将 html 中的某些元素标颜色

有时候为了业务需要将某些 html 标签改一下颜色,比如说将首页的 tabmenu 中 博问专区 改成红色,如下图:

那用 CSQuery 怎么处理呢? 如果玩过 jquery,一般来说步骤如下:

  • 使用 each 遍历每一个子 li 标签
  • 使用 CSS 方法给 li 中 a 标签赋样式
  • 使用 Render 渲染生成一个新的的html

有了步骤,C#代码如下:


        static void Main(string[] args)
        {
            Config.HtmlEncoder = HtmlEncoders.None;

            var jquery = CQ.CreateDocument(new WebClient().DownloadString("http://cnblogs.com"));

            var html = jquery["#nav_left li"].Each(dom =>
               {
                   var self = jquery[dom];

                   var text = self.Text();

                   if (text == "博问" || text == "专区")
                   {
                       self.Find("a").CssSet(new { color = "red" });
                   }
               }).Render();
        }
        

3) 其他的操作方法

除了上面两个操作方法外,你还可以使用 after,before,replaceAll,IS 等等一百来个实用的方法,这篇肯定也无法一一介绍了,大家有兴趣可以下载下来看一看,捣鼓捣鼓。

三:其他用途

除了抓取html中的元素,我觉得这玩意还可以用在发送邮件时操控邮件模板,毕竟在很久以前大家都是用jquery来绘制 html,所以用 CSQuery 也是可以的,相对使用 xslt 有利有弊吧,接下来做一个例子:

1. 生成一个html模板






    
    


    

    2. 使用 CSQuery 给 ul 追加 li

    可以用 Append 将内容追加到

      节点内。

      
          class Program
          {
              static void Main(string[] args)
              {
                  Config.HtmlEncoder = HtmlEncoders.None;
      
                  var strlist = new string[2] { "1", "2" };
      
                  var path = Environment.CurrentDirectory + "\\2.html";
                  var jquery = CQ.CreateFromFile(path);
      
                  foreach (var str in strlist)
                  {
                      jquery.Find("#main").Append($"
    • {str}
    • "); } var html = jquery.Render(); } }

      3. 部分渲染 RenderSelection

      Render方法是将整个Dom渲染成html,但有时候你只需要得到你修改的那部分内容,而不是整个html,这就涉及到了部分渲染,可以用 RenderSelection 方法即可,代码如下:

      
              static void Main(string[] args)
              {
                  Config.HtmlEncoder = HtmlEncoders.None;
      
                  var strlist = new string[2] { "1", "2" };
      
                  var path = Environment.CurrentDirectory + "\\2.html";
                  var jquery = CQ.CreateFromFile(path);
      
                  var current = jquery.Find("#main");
      
                  foreach (var str in strlist)
                  {
                      current.Append($"
    • {str}
    • "); } var html = current.RenderSelection(); Console.WriteLine(html); } ------------- output ----------------
      • 1
      • 2

      四:总结

      Jquery 这种操作模式对我个人来说还是比较舒服的,毕竟熟! 不过在 html5 中也新增了 querySelector 和 querySelectorAll 支持 css3 选择器,非常强大,可 jquery 不光在选择器的灵活上,还在于对节点的灵活操作上,总的来说不是特别富交互的情况下可以怀旧一把。


    推荐阅读
    • 在重复造轮子的情况下用ProxyServlet反向代理来减少工作量
      像不少公司内部不同团队都会自己研发自己工具产品,当各个产品逐渐成熟,到达了一定的发展瓶颈,同时每个产品都有着自己的入口,用户 ... [详细]
    • imx6ull开发板驱动MT7601U无线网卡的方法和步骤详解
      本文详细介绍了在imx6ull开发板上驱动MT7601U无线网卡的方法和步骤。首先介绍了开发环境和硬件平台,然后说明了MT7601U驱动已经集成在linux内核的linux-4.x.x/drivers/net/wireless/mediatek/mt7601u文件中。接着介绍了移植mt7601u驱动的过程,包括编译内核和配置设备驱动。最后,列举了关键词和相关信息供读者参考。 ... [详细]
    • 闭包一直是Java社区中争论不断的话题,很多语言都支持闭包这个语言特性,闭包定义了一个依赖于外部环境的自由变量的函数,这个函数能够访问外部环境的变量。本文以JavaScript的一个闭包为例,介绍了闭包的定义和特性。 ... [详细]
    • 使用nodejs爬取b站番剧数据,计算最佳追番推荐
      本文介绍了如何使用nodejs爬取b站番剧数据,并通过计算得出最佳追番推荐。通过调用相关接口获取番剧数据和评分数据,以及使用相应的算法进行计算。该方法可以帮助用户找到适合自己的番剧进行观看。 ... [详细]
    • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
    • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
    • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
    • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
    • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
    • 20211101CleverTap参与度和分析工具功能平台学习/实践
      1.应用场景主要用于学习CleverTap的使用,该平台主要用于客户保留与参与平台.为客户提供价值.这里接触到的原因,是目前公司用到该平台的服务~2.学习操作 ... [详细]
    • 如何用UE4制作2D游戏文档——计算篇
      篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
    • XML介绍与使用的概述及标签规则
      本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
    • Google Play推出全新的应用内评价API,帮助开发者获取更多优质用户反馈。用户每天在Google Play上发表数百万条评论,这有助于开发者了解用户喜好和改进需求。开发者可以选择在适当的时间请求用户撰写评论,以获得全面而有用的反馈。全新应用内评价功能让用户无需返回应用详情页面即可发表评论,提升用户体验。 ... [详细]
    • 本文介绍了在wepy中运用小顺序页面受权的计划,包含了用户点击作废后的从新受权计划。 ... [详细]
    • 模板引擎StringTemplate的使用方法和特点
      本文介绍了模板引擎StringTemplate的使用方法和特点,包括强制Model和View的分离、Lazy-Evaluation、Recursive enable等。同时,还介绍了StringTemplate语法中的属性和普通字符的使用方法,并提供了向模板填充属性的示例代码。 ... [详细]
    author-avatar
    墨镜小辣妹
    这个家伙很懒,什么也没留下!
    PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
    Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有