HTML解析器HtmlAgilityPack的一些使用总结(C#)
哎~本来这些总结是作为使用时的快速备注,但是用不上了.实际应用当中HtmlAgilityPack的可靠性不太稳定,一主要问题是:
-> 一些字符会出现乱码或者变成'?',如韩语字符.由于我是已经有HTML源,只需要Load后解析,所以设置OverrideEncoding的方法不管用.
-> 有时候获取到的元素内容会多个换行或空格什么的,然后又要增加代码过滤,然后效率就下来了... ...
浪费了不少时间,到头来还是mshtml可靠性高些.而且调用方法也熟悉.
不管网上对各种HTML解析器怎么测评,只有自己试了才知道...
- /*
- c# HtmlAgilityPack
- --------------------------------
- * 关于节点的重要属性:
- Attributes 获取节点的属性集合
- ChildNodes 获取子节点集合(包括文本节点)
- HasAttributes 判断该节点是否含有属性
- HasChildNodes 判断该节点是否含有子节点
- HasClosingAttributes 判断该节点的关闭标签是否含有属性(</xxx class="xxx">)
- Line 获取该节点的开始标签或开始代码位于整个HTML源代码的第几行(行号)
- Name Html元素名
- Id 获取该节点的Id属性
- NextSibling 获取下一个兄弟节点
- PreviousSibling 获取前一个兄弟节点
- NodeType 获取该节点的节点类型(四个:Text,Element,Document,Comment)
- OwnerDocument 节点所在的HtmlDocument文档
- ParentNode 获取该节点的父节点
- XPath 根据节点返回该节点的XPath
- * 关于节点的重要方法:
- Elements(string name); 根据参数名获取匹配的元素集合
- Element(string name); 根据参数名获取一个元素
- DescendantNodes(); 获取所有子代节点,如果有参数,注意元素名要与参数匹配
- DescendantNodesAndSelf(); 获取所有的子代节点以及自身,如果有参数,注意元素名要与参数匹配
- --------------------------------
- Document.GetElementbyId("box").InnerText;
- //枚举元素两种写法
- string s = "";
- HtmlNodeCollection nodes = Document.DocumentNode.SelectNodes("//li");
- foreach (HtmlNode li in nodes)
- {
- s+=li.InnerText+" ";
- }
- --------------------------------
- foreach (HtmlNode li in Document.DocumentNode.Descendants("li"))
- {
- s+=li.InnerText+" ";
- }
- --------------------------------
- string s = node.Attributes["src"].Value;
- string s = node.Attributes["href"].Value;
- string s = node.Attributes["title"].Value;
- --------------------------------
- //获取所有板块的a标签
- HtmlAgilityPack.HtmlNodeCollection collection = doc.DocumentNode.SelectNodes("//a");
- --------------------------------
- //获取所有a标签的链接
- foreach (HtmlNode a in Document.DocumentNode.Descendants("a"))
- {
- s+=a.Attributes["href"].Value+" ";
- }
- 或者
- foreach (HtmlNode a in Document.DocumentNode.SelectNodes("//a"))
- {
- s+=a.Attributes["href"].Value+" ";
- }
- --------------------------------
- //获取标题,SelectSingleNode用于获取满足条件的唯一的节点。
- Document.DocumentNode.SelectSingleNode("//title").InnerText;
- --------------------------------
- //获取name为selected的li,也就是相当于getElementsByName():
- HtmlNode node = Document.DocumentNode.SelectSingleNode("//li[@name='selected']");
- s=node.InnerText;
- 或者
- Document.DocumentNode.SelectSingleNode("//li[@name='selected']").InnerText;
- --------------------------------
- 每一个Htmlnode,你要获取他的数据用这个方法: node.Attributes["src"].Value
- --------------------------------
- xpath包含7个类型:元素(Element),属性(Attribute),文本(Test),命名空间,处理指令,注释,文档根节点。
- 下面列出了最有用的路径(也就是遇到的参数叫:XPath)表达式:
- nodename 选取此节点的所有子节点。
- / 从根节点选取。
- // 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。
- . 选取当前节点。
- .. 选取当前节点的父节点。
- @ 选取属性。
- * 注意:
- “//”:从当前选择的节点开始寻找,对于后面的表达式是在当前节点中的任意位置寻找,只要符合的就加入到选择结果中。
- “./”:也是从当前选择的节点开始选择,但是仅仅是寻找当前节点的直系子元素,而对于孙子及以后的节点都不考虑。
- --------------------------------
- /div/li[1]:选取属于div子元素的第一个li元素。
- /div/li[last()]:选取属于div子元素的最后一个li元素。
- /div/li[last()-1]:选取属于div子元素的倒数第二个li元素。
- /div/li[position()<3]:选取最前面的两个属于 div 元素的子元素的li元素。
- //title[@lang]:选取所有拥有名为lang的属性的title元素。
- //div[@id='box']:选取所有div元素,且这些元素拥有值为box的id属性。
- /div/li[Order>2]:选取div元素的所有li元素,且其中的Order元素的值须大于2。
- /div/li[Order<3]/Title:选取div元素中的li元素的所有Title元素,且其中的Order元素的值须小于3。
- --------------------------------
- */
HTML解析器HtmlAgilityPack的一些使用总结(C#)的更多相关文章
- 【C#】获取网页内容及HTML解析器HtmlAgilityPack的使用
最近经常需要下载一些东西,而这个下载地址又会经过层层跳转,每个页面上都有很多广告,烦不胜烦,所以做了一个一键获得最终下载地址的小工具.使用C#,来获取网页内容,然后通过HtmlAgilityPack获 ...
- C# 语言的两个html解析器
基于C# 语言的两个html解析器 基于C# 语言的两个html解析器 1)Html Agility Pack http://nsoup.codeplex.com/ 代码段示例: HtmlDocu ...
- 基于C# 语言的两个html解析器
基于C# 语言的两个html解析器 1)Html Agility Pack http://nsoup.codeplex.com/ 代码段示例: HtmlDocument doc = new HtmlD ...
- Atitit.html解析器的选型 jsoup nsoup ,java c# .net 版本
Atitit.html解析器的选型 jsoup nsoup ,java c# .net 版本 1. 框架选型的要求1 1.1. 文档多1 1.2. 跨平台1 2. html解析器特性:1 2.1. j ...
- Atitit.html解析器的选型 jsoup nsoup ,java c# .net 版本号
Atitit.html解析器的选型 jsoup nsoup ,java c# .net 版本号 1. 框架选型的要求 1 1.1. 文档多 1 1.2. 跨平台 1 2. html解析器特性: 1 2 ...
- C#简单爬取数据(.NET使用HTML解析器ESoup和正则两种方式匹配数据)
一.获取数据 想弄一个数据库,由于需要一些人名,所以就去百度一下,然后发现了360图书馆中有很多人名 然后就像去复制一下,发现复制不了,需要登陆 此时f12查看源码是可以复制的,不过就算可以复制想要插 ...
- XML技术之DOM4J解析器
由于DOM技术的解析,存在很多缺陷,比如内存溢出,解析速度慢等问题,所以就出现了DOM4J解析技术,DOM4J技术的出现大大改进了DOM解析技术的缺陷. 使用DOM4J技术解析XML文件的步骤? pu ...
- AFN解析器里的坑
AFN框架是用来用来发送网络请求的,它的好处是可以自动给你解析JSON数据,还可以发送带参数的请求AFN框架还可以监测当前的网络状态,还支持HTTPS请求,分别对用的类为AFNetworkReacha ...
- SpringMVC视图解析器
SpringMVC视图解析器 前言 在前一篇博客中讲了SpringMVC的Controller控制器,在这篇博客中将接着介绍一下SpringMVC视 图解析器.当我们对SpringMVC控制的资源发起 ...
随机推荐
- SDK,API,DLL名词解释
SDK (software devalopment kit) 软件开发工具包 : 一般都是一些软件工程师Wie特定的软件包.软件框架.硬件平台.操作系统等建立应用软件时的开发工具的集合. API (A ...
- Javascript模块化编程(三):require.js的用法
Javascript模块化编程(三):require.js的用法 原文地址:http://www.ruanyifeng.com/blog/2012/11/require_js.html 作者: 阮一峰 ...
- BZOJ 2096: [Poi2010]Pilots
Description 求一个最长的序列,最大值最小值之差不超过 \(k\) . Sol 单调队列. 一个队列直接上就行.. Code /******************************* ...
- Visual Studio 默认保存为UTF8编码
Visual Studio (中文版)默认保存的文本文件是GB2312编码(代码页936)的,默认的行尾(End of line)是CRLF的. 如果仅仅是在windows下开发问题也不大,但是涉及到 ...
- saltstack命令执行过程
saltstack命令执行过程 具体步骤如下 Salt stack的Master与Minion之间通过ZeroMq进行消息传递,使用了ZeroMq的发布-订阅模式,连接方式包括tcp,ipc salt ...
- js对Cookie的读写操作
//读Cookie function getCookie(objName) {//获取指定名称的cookie的值 var arrStr = document.cookie.split("; ...
- HP网络打印机--如何添加打印机
HP网络打印机采用web服务形式,应添加打印机-通过Internet的打印机--填写网址http://192.168.1.10:80(从其他win7电脑-计算机-网络-网络设备中双击添加打印机,然后在 ...
- Gnome_Terminal
快捷键 ctrl shift m 我自定义的快捷键,可以给终端命名 ctrl shift t 新建标签页,并且目录为当前目录 ctrl shift pageup 标签页往前移 ctrl shift p ...
- 小众Tox——大众的“去中心化”聊天软件
★Tox是什么 一个反窥探的开源项目:一种基于DHT(BitTorrent)技术的即时通讯协议:一个为安全而生的加密通讯系统 .美国棱镜计划曝光后,一个名为 irungentoo 的牛人于17天后的2 ...
- 关于chart.js 设置canvas的宽度为父级元素的宽度的百分百 以及 X轴上面刻度数据太多如何处理
今天在做一个数据统计的界面的时候,需要做折线统计图,在网上找了一圈发现数据统计的插件还是不少的,本着轻量级的的原则选择了Chart.js,后来在做的过程中便遇到两个问题,以此记录下来,和刚刚接触前端的 ...