哎~本来这些总结是作为使用时的快速备注,但是用不上了.实际应用当中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#)的更多相关文章

  1. 【C#】获取网页内容及HTML解析器HtmlAgilityPack的使用

    最近经常需要下载一些东西,而这个下载地址又会经过层层跳转,每个页面上都有很多广告,烦不胜烦,所以做了一个一键获得最终下载地址的小工具.使用C#,来获取网页内容,然后通过HtmlAgilityPack获 ...

  2. C# 语言的两个html解析器

    基于C# 语言的两个html解析器   基于C# 语言的两个html解析器 1)Html Agility Pack http://nsoup.codeplex.com/ 代码段示例: HtmlDocu ...

  3. 基于C# 语言的两个html解析器

    基于C# 语言的两个html解析器 1)Html Agility Pack http://nsoup.codeplex.com/ 代码段示例: HtmlDocument doc = new HtmlD ...

  4. 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 ...

  5. Atitit.html解析器的选型&#160;jsoup&#160;nsoup&#160;,java&#160;c#&#160;.net&#160;版本号

    Atitit.html解析器的选型 jsoup nsoup ,java c# .net 版本号 1. 框架选型的要求 1 1.1. 文档多 1 1.2. 跨平台 1 2. html解析器特性: 1 2 ...

  6. C#简单爬取数据(.NET使用HTML解析器ESoup和正则两种方式匹配数据)

    一.获取数据 想弄一个数据库,由于需要一些人名,所以就去百度一下,然后发现了360图书馆中有很多人名 然后就像去复制一下,发现复制不了,需要登陆 此时f12查看源码是可以复制的,不过就算可以复制想要插 ...

  7. XML技术之DOM4J解析器

    由于DOM技术的解析,存在很多缺陷,比如内存溢出,解析速度慢等问题,所以就出现了DOM4J解析技术,DOM4J技术的出现大大改进了DOM解析技术的缺陷. 使用DOM4J技术解析XML文件的步骤? pu ...

  8. AFN解析器里的坑

    AFN框架是用来用来发送网络请求的,它的好处是可以自动给你解析JSON数据,还可以发送带参数的请求AFN框架还可以监测当前的网络状态,还支持HTTPS请求,分别对用的类为AFNetworkReacha ...

  9. SpringMVC视图解析器

    SpringMVC视图解析器 前言 在前一篇博客中讲了SpringMVC的Controller控制器,在这篇博客中将接着介绍一下SpringMVC视 图解析器.当我们对SpringMVC控制的资源发起 ...

随机推荐

  1. MySQL 备份与恢复

    一.备份/恢复策略 考虑因素有: (A) 表的存储引擎是否事务性的,在数据一致性方面不太一样. (B) 确定是全备份还是增量备份, (C) 考虑采取复制的方法做异地备份,复制不能代替备份 (D) 定期 ...

  2. 教你怎么快速配置 React

    导读 React 是一个构建用户界面的库,而它只是组成一个应用的一部分.应用还有其他的部分——风格.路由器.npm 模块.ES6 代码.捆绑和更多——这就是为什么使用它们的开发者不断流失的原因.这被称 ...

  3. 购物车相关 js

    <div class="caigou"> <form action="" method="post"> <di ...

  4. redis实战(01)_redis安装

    早就想对redis进行实战操作了,最近看了一些视频和参考书籍,总结总结一下,redis实战内容: 实战前先对redis做一个大概的认识: 现在开始安装redis了... redis的安装下载地址 ht ...

  5. 整理一下Entity Framework的查询 [转]

    Entity Framework是个好东西,虽然没有Hibernate功能强大,但使用更简便.今天整理一下常见SQL如何用EF来表达,Func形式和Linq形式都会列出来(本人更喜欢Func形式). ...

  6. 将jetty嵌入到应用中的简单案例

    前面说过jetty最广泛的应用是可以方便的嵌入到应用程序中,而不是作为应用服务器,下面就用最简单的demo来演示一个最简单的应用 1.下载并导入依赖 首先应该建立一个普通的java项目,然后把依赖包导 ...

  7. SQL排序问题

    ''按多个字段排序 Select * From Job order by job desc,id asc ''按首字符(非数字)排序 )) ) end ''按首字符分组 ) ''合并Order by排 ...

  8. wps恢复经典模式

    经典模式 情况一: 恢复的方法:点击红色区域 情况二: 恢复的方法:点击红色区域

  9. C# extended toolkit propertygrid 隐藏部分属性

    该方法是通过更改ShowDetail的状态来实现的隐藏属性 首先在引用里右键 管理NuGet程序包 查找extended wpf toolkit 并安装 然后在MainWindow.xaml添加引用 ...

  10. 常用的HTML代码

    一.文字1.标题文字 <h#>..........</h#> #=1~6:h1为最大字,h6为最小字 2.字体变化 <font>..........</fon ...