开源项目Html Agility Pack实现快速解析Html
这是个很好的的东西,以前做Html解析都是在用htmlparser,用的虽然顺手,但解析速度较慢,碰巧今天找到了这个,就拿过来试,一切出乎意料,非常爽,推荐给各位使用。
下面是一些简单的使用技巧,希望对大家有用,我个人也是个学习过程。
Why Html Agility Pack? (以下简称HAP)
.Net下解析HTML文件有很多种选择,包括微软自己也提供MSHTML用于manipulate HTML文件。但是,经过我一段时间的搜索,Html Agility Pack浮出水面:它是Stackoverflow网站上推荐最多的C# HTML解析器。HAP开源,易用,解析速度快。
How to use HAP?
1. 下载http://htmlagilitypack.codeplex.com/
2. 解压
3. 在Visual Studio Solution里,右击project -> add reference -> 选择解压文件夹里的HTMLAgilityPack.dll -> 确定
4. 代码头部加入 using HtmlAgilityPack;
Done!
- HtmlWeb webClient = new HtmlWeb();
- HtmlDocument doc = webClient.Load("http://xxx");
- HtmlNodeCollection hrefList = doc.DocumentNode.SelectNodes(".//a[@href]");
- if (hrefList != null)
- {
- foreach (HtmlNode href in hrefList)
- {
- HtmlAttribute att = href.Attributes["href"];
- doSomething(att.Value);
- }
- }
Q: 如何根据ID选择HTML结点?
A: 利用@id='xxx', e.g.,
- HtmlNode bugSum = doc.DocumentNode.SelectSingleNode("//h2[@id='summary']");
Q: 如何得到结点的文字内容或Html内容?
- node.InnerText.Trim()
- node.InnerHtml
- node.OuterHtml
Q: 如何在html树结构下查找结点?
A: 比如从根节点查找id=container的div下的第一个table:
- HtmlNode table = doc.DocumentNode.SelectSingleNode("//div[@id='container']/table[1]");
注意路径里"//"表示从根节点开始查找,两个斜杠‘//’表示查找所有childnodes;一个斜杠'/'表示只查找第一层的childnodes(即不查找grandchild);点斜杠"./"表示从当前结点而不是根结点开始查找。接上一行代码,比如要查找table所有直接子结点的tr:
- HtmlNodeCollection tr = table.SelectNodes("./tr");
Q: 如何得到结点的ID?
A: 很简单: node.ID
Q: 如果一段html存在字符串里,是否可以用Html Agility Pack进行处理?
A:可以,先将字符串load进来,之后的处理方法一样:
- <pre name="code" class="csharp">//load the original html
- string html = "some html stuff"
- HtmlDocument doc = new HtmlDocument();
- doc.LoadHtml(@html);
Q: 我对load进来的html进行了一些处理,比如改变了一些结点内容,删除了一些结点什么的,为什么结果却没有变化?
A: 也许你忘记save你对html的改变了,假设html存在字符串中:
- //load the original html
- string html = "some html stuff"
- HtmlDocument doc = new HtmlDocument();
- doc.LoadHtml(@html);
- //make some changes
- doSomething();
- //save the change
- var sb = new StringBuilder();
- using (var writer = new StringWriter(sb))
- {
- doc.Save(writer);
- }
Q: 如何去掉外层的html tag只留下内容?
A: 用remove方法。假设结点<a href=xxx>ABCD</a>,你想留下ABCD而不要<a></a>,那你需要先得到这个Html结点,假设叫link:
- link.ParentNode.RemoveChild(link,true);
参数true表示留下grandchild,在这里即内容ABCD; false表示将此结点连同其grandchilds一起删除。
规则有很多,网上提供了源代码,可以研究一下,还有源代码有乱码问题,是字符集的问题,只需要写一个方法来自动判断就可以解决了
开源项目Html Agility Pack实现快速解析Html的更多相关文章
- C# 网络爬虫利器之Html Agility Pack如何快速实现解析Html
简介 现在越来越多的场景需要我们使用网络爬虫,抓取相关数据便于我们使用,今天我们要讲的主角Html Agility Pack是在爬取的过程当中,能够高效的解析我们抓取到的html数据. 优势 在.NE ...
- Python优秀开源项目Rich源码解析
这篇文章对优秀的开源项目Rich的源码进行解析,OMG,盘他.为什么建议阅读源码,有两个原因,第一,单纯学语言很难在实践中灵活应用,通过阅读源码可以看到每个知识点的运用场景,印象会更深,以后写代码的时 ...
- 开源项目月刊《HelloGitHub》第 60 期
兴趣是最好的老师,HelloGitHub 就是帮你找到兴趣! 简介 分享 GitHub 上有趣.入门级的开源项目. 这是一个面向编程新手.热爱编程.对开源社区感兴趣 人群的月刊,月刊的内容包括:各种编 ...
- Html Agility Pack 使用 XPath 选择器
想做一个爬虫程序,以前用的一直使用CSS选择器的html解析插件,最近做的项目想使用 Html Agility Pack 来做解析 Html Agility Pack使用 XPath 和 Linq 来 ...
- 使用Html Agility Pack快速解析Html内容
Html Agility Pack 是一个开源的.NET 方案HTML解析器. 开源地址:https://github.com/zzzprojects/html-agility-pack 用法:vs上 ...
- [c#] Html Agility Pack 解析HTML
摘要 在开发过程中,很有可能会遇到这样的情况,服务端返回的是html的内容,但需要在客户端显示纯文本内容,这时候就需要解析这些html,拿到里面的纯文本.达到这样的目的可以有很多途径,比如自己写正则表 ...
- HTML Agility Pack:簡單好用的快速 HTML Parser
HTML Agility Pack:簡單好用的快速 HTML Parser Codeplex 軟體套件(Package)資訊 套件名稱 HTML Agility Pack 作者 Simon Mouri ...
- Html Agility Pack 解析Html
Hello 好久不见 哈哈,今天给大家分享一个解析Html的类库 Html Agility Pack.这个适用于想获取某网页里面的部分内容.今天就拿我的Csdn的博客列表来举例. 打开页面 用Fir ...
- Android开发周报:Flyme OS开源、经典开源项目解析
Android开发周报:Flyme OS开源.经典开源项目解析 新闻 <魅族Flyme OS源码上线Github> :近日魅族正式发布了MX5,并且在发布会上,魅族还宣布Flyme OS开 ...
随机推荐
- 跨集群 distcp命令
两个集群之间做数据同步,而且两个集群之间的版本不一致,这个时候使用的是hftp协议或者webhdfs协议! 如果试图在两个运行着不同HDFS版本的集群上使用distcp命令来复制数据并使用hdfs协议 ...
- 【hihoCoder】1041. 国庆出游
问题:详见http://hihocoder.com/problemset/problem/1041 有n个城市,城市编号为1-n,城市间有n-1条路(所以,城市路网是一棵树).给定一个序列S,要求判断 ...
- js中获取键盘事件【转】
<script type="text/javascript" language=JavaScript charset="UTF-8"> 2 docu ...
- 注入语句详解(get注入,cookie注入,搜索型注入等)
注意:对于普通的get注入,如果是字符型,前加' 后加 and ''=' 拆半法 ###################################### and exists (select ...
- Xtrabackup2.3.4安装
安装过程种有很多报错,这里我就不一一解释. wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.3.5/bin ...
- Codeforces Round #346 (Div. 2) E F
因为很久没有个人认真做题了 昨天晚上开了场虚拟cf来锻炼个人手速 选的是第一次做cf的场 那时候7出3还被hack...之后也没补题 这次做的时候顺便回忆了一下以前比赛的时候是怎么想的 发现经验还是很 ...
- 有return语句情况下,try-catch-finally的执行顺序
重要结论: 1.不管有没有出现异常,finally块中代码都会执行 2.当try和catch中有return时,finally仍然会执行 3.finally是在return后面的表达式运算后执行的(此 ...
- javascript大神修炼记(7)——OOP思想(多态)
读者朋友们大家好,今天我们就接着前面的内容讲,前面我们已经讲到了继承,今天我们就来讲OOP目前最后一个体现,那就是多态,因为javascript语言的灵活性,所以我们是没有办法使用接口的,所以这也给j ...
- 程序中的@Override是什么意思
@Override是Java5的元数据,自动加上去的一个标志,告诉你说下面这个方法是从父类/接口 继承过来的,需要你重写一次,这样就可以方便你阅读,也不怕会忘记 @Override是伪代码,表示重写( ...
- C#对泛型List<T>系列化与反系列化
练习一个小例子,在C#中,怎样对泛型List<T>数据集进行系列化与反系列化.我们先了解msdn提供的JavaScriptSerializer类: JavaScriptSerializer ...