原文:【.NET】使用HtmlAgilityPack抓取网页数据

刚刚学习了XPath路径表达式,主要是对XML文档中的节点进行搜索,通过XPath表达式可以对XML文档中的节点位置进行快速定位和访问,html也是也是一种类似于xml的标记语言,但是语法没有那么严谨,在codeplex里有一个开源项目HtmlAgilityPack,提供了用XPath解析HTML文件,下面掩饰如何使用该类库的使用

首先说下XPath路径表达式

XPath路径表达式

  用来选取XML文档中的节点或节点集的

  1、术语:节点(Node):7种类型:元素,属性,文本,命名空间,处理命令,注释,文档(根)节点

  2、节点关系:父(Parent),子(Children),同胞(Sibling),先辈(Ancestor),后代(Descendant)

  3、路径表达式

   nodename  节点名,选取此节点的所有子节点  例: childnode  当前节点中的childnode子节点,不包含孙子及以下的节点

      /     从根节点选取  例:/root/childnode/grandsonnode  

       //     表示所有后代节点  例://childnode    所有名为childnode的后代节点

      .    表示当前节点  例:  ./childnode    表示当前节点的childnode节点

      ..     表示父节点  例:  ../nearnode     表示父亲节点的nearnode子节点

     @    选取属性  /root/childnode/@id     表示childnode的所有含有id属性的节点集

  4、谓语(Predicates)

    谓语可以对节点集进行一些限制,使选择更精确

      /root/book[1]    节点集中的第一个节点

      /root/book[last()]  节点集中最后一个节点

      /root/book[position() - 1]  节点集中倒数第二个节点集

      /root/book[position() < 5]  节点集中前五个节点集

      /root/book[@id]      节点集中含有属性id的节点集

      /root/book[@id='chinese']  节点集中id属性值为chinese的节点集

      /root/book[price > 35]/title  节点集中book的price元素值大于35的title节点集

  5、通配符:XPath路径中同样支持通配符(*,@*,node(), text())

    例:  /bookstore/*

        //title[@*]

  6、XPath轴

    定义相对于当前节点的节点集

      ancestor    所有祖先节点

      attribute    所有属性节点

      child      所有子元素

      descendant  所有后代节点(子,孙。。。)

      following    结束标记后的所有节点      preceding   开始标记前的所有节点

      following-sibling  结束标记后的所有同胞节点

      preceding-sibling  开始标记前的所有同胞节点

      namespace   当前命名空间的所有节点

      parent     父节点

      self       当前节点

    用法:轴名称::节点测试[谓语]

      例:  ancestor::book

            child::text()

  7、运算符

    |  两个节点集的合并  例:/root/book[1] | /root/book[3]

    +,-,*,dev,mod

    =,!=,<,>,<=,>=

    or,and  或和与

 

htmlDoc.DocumentNode.SelectNodes("//div[@ispublished='false' or @ispublished='False']");

//Xpath node selection - how to select 2 different elements - htmlagilitypack
//选择两种不同标签的节点string srxPathOfCategory = "//div[@class='breadcrumbs']//li[@class='product'] | //div[@class='breadcrumbs']//a";//So for " or " just need to use " | "

  

  

    //删除注释,script,style
    node.Descendants().Where(n => n.Name == "script" || n.Name == "style" || n.Name=="#comment").ToList().ForEach(n => n.Remove());//遍历node节点的所有后代节点foreach(var HtmlNode in node.Descendants()){}

HtmlAgilityPack类库用法

  1、首先需要获取到html页面数据,可以通过WebRequest类来获取

        public static string GetHtmlStr(string url){    try{WebRequest rGet = WebRequest.Create(url);WebResponse rSet = rGet.GetResponse();Stream s = rSet.GetResponseStream();StreamReader reader = new StreamReader(s, Encoding.UTF8);return reader.ReadToEnd();}catch (WebException){//连接失败return null;}}

  2、通过HtmlDocument类加载html数据

        string htmlstr = GetHtmlStr("http://www.hao123.com");HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();doc.LoadHtml(htmlstr);HtmlNode rootnode = doc.DocumentNode;    //XPath路径表达式,这里表示选取所有span节点中的font最后一个子节点,其中span节点的class属性值为num//根据网页的内容设置XPath路径表达式string xpathstring = "//span[@class='num']/font[last()]";    HtmlNodeCollection aa = rootnode.SelectNodes(xpathstring);    //所有找到的节点都是一个集合if(aa != null){string innertext = aa[0].InnerText;string color = aa[0].GetAttributeValue("color", "");    //获取color属性,第二个参数为默认值//其他属性大家自己尝试}

  也可以通过HtmlWeb类来获得HtmlDocument

        HtmlWeb web = new HtmlWeb();HtmlAgilityPack.HtmlDocument doc = web.Load(url);HtmlNode rootnode = doc.DocumentNode;

补充:

  多个属性条件查询      //div[@align='center' and @height='24']

  不存在class属性       //div[not(@class)]

提取的时候需要判断是这个标签的class属性是否包含某个指定的属性值,google了一下(百度搜索没有相应的结果),利用Xpath的contains可以解决,代码如下:

C#
1
2
3
4
5
6
7
8

//选择不包含class属性的节点
var result = node.SelectNodes(".//span[not(@class)]");
//选择不包含class和id属性的节点
var result = node.SelectNodes(".//span[not(@class) and not(@id)]");
//选择不包含class="expire"的span
var result = node.SelectNodes(".//span[not(contains(@class,'expire'))]");
//选择包含class="expire"的span
var result = node.SelectNodes(".//span[contains(@class,'expire')]");

另一种解析方式,假如我们需要根据div的class属性是否包含post值来提取div中的InnerText:

1
2
3

<div id="post-405" class="post-405 post type-post status">inner text</div>
<div id="post-105" class="post-105 post type-post status">inner text</div>
<div id="post-5" class="post-5 post type-post status">inner text</div>

可以用以下方法来提取符合条件的所有HtmlNode节点

C#
1
2
3
4

var results = doc.DocumentNode
                 .Descendants("div")
                 .Where(x=>x.Attributes.Contains("class") &&
                           x.Attributes["class"].Value.Contains("post"));

提取得到节点数据之后,根据实际处理即可。

【.NET】使用HtmlAgilityPack抓取网页数据相关推荐

  1. 使用HtmlAgilityPack抓取网页数据

    XPath路径表达式,主要是对XML文档中的节点进行搜索,通过XPath表达式可以对XML文档中的节点位置进行快速定位和访问,html也是也是一种类似于xml的标记语言,但是语法没有那么严谨,在cod ...

  2. cookie追加数据_集算器 SPL 抓取网页数据

    [摘要] 集算器 SPL 支持抓取网页数据,根据抓取定义规则,可将网页数据下载到在本地进行统计分析.具体定义规则要求.使用详细情况,请前往乾学院:集算器 SPL 抓取网页数据! 网站上的数据源是我们进 ...

  3. python爬网页数据用什么_初学者如何用“python爬虫”技术抓取网页数据?

    原标题:初学者如何用"python爬虫"技术抓取网页数据? 在当今社会,互联网上充斥着许多有用的数据.我们只需要耐心观察并添加一些技术手段即可获得大量有价值的数据.而这里的&quo ...

  4. web scraper 抓取网页数据的几个常见问题

    如果你想抓取数据,又懒得写代码了,可以试试 web scraper 抓取数据. 相关文章: 最简单的数据抓取教程,人人都用得上 web scraper 进阶教程,人人都用得上 如果你在使用 web s ...

  5. php如何抓取网页内容,php如何抓取网页数据?

    php抓取网页数据header("Content-type: text/html; charset=utf-8"); //$url = "https://www.cnbl ...

  6. python 抓取网页数据

    python 抓取网页数据 此文解决如何从不同网页爬取数据的问题及注意事项,重点说明requests库的应用. 在开始之前,要郑重说明一下,不是每一个网页都可以爬取数据哦.有的网页涉及个人隐私或其他敏 ...

  7. excel数据自动录入网页_Excel自动抓取网页数据,数据抓取一键搞定

    网站上的数据源是我们进行统计分析的重要信息源.我们在生活中常常听到一个词叫"爬虫",能够快速抓取网页上的数据,这对于数据分析相关工作来说极其重要,也是必备的技能之一.但是爬虫大多需 ...

  8. Python 爬虫篇#笔记02# | 网页请求原理 和 抓取网页数据

    目录 一. 网页请求原理 1.1 浏览网页的过程 1.2 统一资源定位符URL 1.3 计算机域名系统DNS 1.4 分析浏览器显示完整网页的过程 1.5 客户端THHP请求格式 1.6 服务端HTT ...

  9. python 实时抓取网页数据并进行 筛查

    python 实时抓取网页数据并进行 筛查 爬取数据的两种方法 : 方法 1 : 使用 requests.get() 方法,然后再解码,接着 调用 BeautifulSoup API 首先看 head ...

最新文章

  1. REST API 基于ACCESS TOKEN 的权限解决方案
  2. java 将一张图片切割成n个小图片,任意切割一张图片成新图片
  3. 钓鱼(信息学奥赛一本通-T1431)
  4. 26 fps 的视频超分辨率模型 DAP!在线输出720P视频
  5. Self Attention和Multi-Head Attention的原理和实现
  6. python制作桌面小程序_微信小程序在线制作:快速生成一个餐饮小程序
  7. CVE-2021-3156:隐藏10年之久的 Sudo 漏洞,可使任意用户获得root 权限(详述)
  8. 【无线通信协议笔记】蓝牙篇:传输速率
  9. Scratch(四十三):赛龙舟
  10. 共享打印机服务器系统64位,win7系统64位和winXP 32位共享网络打印机的操作方法...
  11. 10个程序员最喜欢的 HTML和CSS 等在线代码编辑器
  12. vue热敏打印机_java+lodop+vue+热敏打印机,打印图片
  13. C语言摇骰子比大小,三个骰子出点规律|玩3个骰子猜大小必赢技巧
  14. 20135202闫佳歆——信息安全系统设计基础第九周学习总结
  15. 不到3000块钱,如何支撑起每月500万次访问量及80TB流量的网站?
  16. 多元化邮件插图成鲜活生命力,助力邮件营销转化!
  17. 明明在内网,做种的人很多,为什么在transmission里bt下载速度仅10kb/s
  18. serviceBattery mac换电池 mac怎么换电池mac拆机
  19. C语言学习笔记(kk-zkx)
  20. 旅游类APP-环境搭建

热门文章

  1. 判断小写字母 php,php中怎样推断字母是大写照样小写_后端开发
  2. java服务 重启_Shell脚本自动重启Java服务
  3. java cassandra连接池_Cassandra Java驱动程序的最佳设置只能写入本地数据中心
  4. java导出word文档_PHPWord导出word文档
  5. 江西工业职业技术学院计算机专业在哪个校区,江西工业职业技术学院几个校区...
  6. html5转换成mp4视频,HTML5的canvas动画转视频MP4
  7. mysql in从数据库取数_MySQL数据库中 where in 用法详解
  8. Javascript隐式数据类型转换(==、+、Object)
  9. 计算机专业教研成绩,2018学年第一学期计算机组教研组工作计划
  10. html非封闭标签,自封闭的html标签