• 基于CefSharp和XPath的C#爬虫


    1. //需要引入的声明
    2. using CefSharp;
    3. using CefSharp.WinForms;
    4. using System.Xml;
    5. using System.Xml.XPath;
    6. using HtmlAgilityPack;

    一、获取HTML数据

            可以使用webBrowser或CefSharp获取网络数据。浏览器实例化后可以选择是否在前台显示。获取的HTML将以字符串形式存储。

            其中,CefSharp的初始化代码如下:

    1. public ChromiumWebBrowser ThisWeb; //浏览器对象
    2. public void InitializeChromium()
    3. {
    4. CefSettings settings = new CefSettings();
    5. Cef.Initialize(settings);
    6. ThisWeb = new ChromiumWebBrowser("www.baidu.com"); //打开
    7. ThisWeb.LifeSpanHandler = new OpenPageSelf();//禁止外部打开
    8. this.panelWeb.Controls.Add(ThisWeb); //绑定前台控件,可不绑定
    9. }
    ThisWeb.Load(txtUrl.Text);    //数据访问
    string task1 = await ThisWeb.GetSourceAsync();    //获取HTML内容

    二、数据转换

            在获取HTML内容后,使用HtmlAgilityPack,将string型转换为HTML对象。

    1. HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument(); //HTML对象
    2. doc.LoadHtml(task1);//将字符串转换成 HtmlDocument

    三、使用XPath进行解析

    1. doc.LoadHtml(task1);//加载HTML
    2. HtmlAgilityPack.HtmlNodeCollection elem = doc.DocumentNode.SelectNodes(XPath公式);

            Ps.使用SelectNodes仅能获取到结点,并不能使用其中的数据。若需选择结点中的元素,则需遍历elem集合后使用GetAttributeValue进行获取。

    1. foreach (var item in elem)
    2. {
    3. if (txtElem.Text != "")
    4. item.GetAttributeValue(txtElem.Text, "Null"); //参数:元素名,未找到的输出
    5. else
    6. item.OuterHtml.ToString(); //获取具体内容
    7. }

    四、关于XPath

            1.Chrome插件

                    在Chrome中安装:XPath Helper。可以在浏览器中调出进行语句调试

                     按照元素逻辑层级编写XPath语句。XPath的规则如下:

    符号说明示例示例说明
    /表示从根节点开始选择/pets选择根节点pets
    表示节点和子节点之间的间隔符/pets/dog选择pets节点下的dog节点
    //xx表示从整个xml文档中查找,而不考虑当前节点位置//price选择文档中所有的price节点
    .单个英文半角句点表示选择当前节点/pets/.选择pets节点
    ..双点,表示选择父节点/pets/dog[0]/..表示pets节点,也就是第一个dog节点的父节点
    @xx表示选择属性//dog/@color表示选择所有dog节点的color属性集合
    […]中括号表示选择条件,括号内为条件//dog[@color=’white’]所有color为white的dog节点
    //dog[/price<100]所有price字节点值小于100的dog节点
    中括号内数字为节点索引,类似c#等语言中的数组,数组下标是从1开始的//dog[1]第1个dog节点
    //dog[last()]最后一个dog节点,last()是xPath内置函数
    |单竖杠表示合并节点结合//dog[@color=’white’] | //cat[@color=’white’]color属性为white的dog节点和color属性为white的cat节点
    *星号表示任何名字的节点或者属性//dog/*表示dog节点的所有子节点
    //dog/@*表示dog节点的所有属性节点

     效果如下:

     

  • 相关阅读:
    CBAM: 卷积块注意模块
    Gem5 for Ubuntu20.04
    软考-架构篇-架构模型
    Metabase学习教程:视图-4
    喝酒摇骰子重启人生多款微信小程序源码分享
    深入浅出的给大家分析下现在做抖音短视频还来得及吗?
    StarGAN v2: Diverse Image Synthesis for Multiple Domains (多域多样性图像合成)
    基于JAVA水星家纺网站计算机毕业设计源码+数据库+lw文档+系统+部署
    c++视觉处理---高斯滤波
    微信小程序开发详细步骤是什么?
  • 原文地址:https://blog.csdn.net/weixin_37878740/article/details/127754176