当前位置: 首页 > article >正文

C# 使用HtmlAgilityPack解析提取HTML内容

写在前面
 

HtmlAgilityPack是一个HTML解析类库,日常用法就是爬虫获取到内容后,先用XPath获取目标节点,再用正则进行匹配;使用XPath的目的主要是将目标节点或内容限定在一个较小的范围,如果一上来就用正则那效率肯定不行,因为正则的规则设计耗时较长;而XPath直接可以用浏览器F12开发者工具窗口,鼠标右键复制XPath获得,非常方便。但在微观内容的操作上XPath就显得太粗糙了,这时候就需要用正则来匹配,由于范围已经用XPath做过了筛选,所以此时的正则规则的设计要考虑的就很少了;两者结合效率就大大提升了,解析HTML源码实在是个耗时费力的体力活。

 老套路通过NuGet获取类库

代码实现

    using HtmlAgilityPack;

    public static class HtmlDocumentMgr
    {
        #region Public Methods

        public static HtmlNodeCollection GetNodes(string xPath)
        {
            var body = BrowserController.GetFrameBody();
            var doc = GetHtmlDocument(body);
            return doc.DocumentNode.SelectNodes(xPath);
        }

        public static HtmlNode GetNode(string xPath)
        {
            var body = BrowserController.GetFrameBody();
            var doc = GetHtmlDocument(body);
            return doc.DocumentNode.SelectSingleNode(xPath);
        }

        public static HtmlDocument GetHtmlDocument(string html)
        {
            var doc = new HtmlDocument();
            doc.LoadHtml(html);
            return doc;
        }


        #endregion

    }

 HTML 内容可以是独立爬虫直接获取的,也可以从内嵌浏览器中获得,本文采用内嵌浏览器的方式,获得HTML的代码如下,仅做参考示意。

        public static string GetFrameBody()
        {
            var js = "document.querySelector('body').outerHTML";
            var evalRet = Browser.MainFrame.EvaluateScriptAsync(js);
            evalRet.Wait();
            if (evalRet.Result != null)
            {
                var ret = evalRet.Result.Result;
                return ret.ToNormalString();
            }
            return string.Empty;
        }

调用示例

        public static HtmlNode GetDescribeNode(string describe)
        {
            var body = BrowserController.GetFrameBody();
            var doc = new HtmlDocument();
            doc.LoadHtml(body);

            var match = string.Format(".//label[contains(text(), \"{0}\")]", describe);
            var labelNode = doc.DocumentNode.SelectSingleNode(match);
            if (labelNode == null && describe.Contains(" "))
            {
                describe = describe.Replace(" ", " ");
                match = string.Format(".//label[contains(text(), \"{0}\")]", describe);
                labelNode = doc.DocumentNode.SelectSingleNode(match);
            }
            return labelNode;
        }


http://www.kler.cn/a/155941.html

相关文章:

  • 【2024最新】基于springboot+vue的闲一品交易平台lw+ppt
  • 【秋招笔试-支持在线评测】11.13花子秋招(已改编)-三语言题解
  • DApp开发:定制化解决方案与源码部署的一站式指南
  • 使用支付宝沙箱完成商品下单
  • 【Hadoop实训】Hive 数据操作①
  • 深入理解接口测试:实用指南与最佳实践5.0(二)
  • 爬虫伦理与法律:确保数据采集合法性与伦理性
  • Unity工具脚本-检测资源文件夹是否有预制件是指定层级
  • 深入了解Java8新特性-日期时间API之ZonedDateTime类
  • 【Arduino库之:FastLED库】
  • SCAU:数字字符序列2
  • Linux(13):例行性工作排程
  • 前后端分离部署https
  • qt-C++笔记之组件-分组框QGroupBox
  • C/C++ 快速排序
  • Python 错误 TypeError: __str__ Returned Non-String but Printing Output
  • 【源码解析】聊聊线程池 实现原理与源码深度解析(一)
  • 从零构建属于自己的GPT系列3:模型训练2(训练函数解读、模型训练函数解读、代码逐行解读)
  • 算法复习,数据结构 ,算法特性,冒泡法动态演示,复杂度,辗转相除法*,寻找最大公因数
  • Win中Redis部署与配置
  • SCAU:判断点是否在圆上
  • QWebChannel 是 Qt 框架中用于在 Web 页面和 Qt 应用程序之间进行通信的类
  • 【doccano】文本标注工具——属性级情感分析标注自己的业务数据
  • 使用SLS日志服务采集Kong网关的日志
  • c语言编程题经典100例——(41~45例)
  • Android textView 显示: STRING_TOO_LARGE