这是个很好的的东西,以前做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!

  1. HtmlWeb webClient = new HtmlWeb();
  2. HtmlDocument doc = webClient.Load("http://xxx");
  3. HtmlNodeCollection hrefList = doc.DocumentNode.SelectNodes(".//a[@href]");
  4. if (hrefList != null)
  5. {
  6. foreach (HtmlNode href in hrefList)
  7. {
  8. HtmlAttribute att = href.Attributes["href"];
  9. doSomething(att.Value);
  10. }
  11. }

Q: 如何根据ID选择HTML结点?

A: 利用@id='xxx', e.g.,

  1. HtmlNode bugSum = doc.DocumentNode.SelectSingleNode("//h2[@id='summary']");

Q: 如何得到结点的文字内容或Html内容?

  1. node.InnerText.Trim()
  2. node.InnerHtml
  3. node.OuterHtml

Q: 如何在html树结构下查找结点?

A: 比如从根节点查找id=container的div下的第一个table:

  1. HtmlNode table = doc.DocumentNode.SelectSingleNode("//div[@id='container']/table[1]");

注意路径里"//"表示从根节点开始查找,两个斜杠‘//’表示查找所有childnodes;一个斜杠'/'表示只查找第一层的childnodes(即不查找grandchild);点斜杠"./"表示从当前结点而不是根结点开始查找。接上一行代码,比如要查找table所有直接子结点的tr:

  1. HtmlNodeCollection tr = table.SelectNodes("./tr");

Q: 如何得到结点的ID?

A: 很简单: node.ID

Q: 如果一段html存在字符串里,是否可以用Html Agility Pack进行处理?

A:可以,先将字符串load进来,之后的处理方法一样:

  1. <pre name="code" class="csharp">//load the original html
  2. string html = "some html stuff"
  3. HtmlDocument doc = new HtmlDocument();
  4. doc.LoadHtml(@html);

Q: 我对load进来的html进行了一些处理,比如改变了一些结点内容,删除了一些结点什么的,为什么结果却没有变化?

A: 也许你忘记save你对html的改变了,假设html存在字符串中:

  1. //load the original html
  2. string html = "some html stuff"
  3. HtmlDocument doc = new HtmlDocument();
  4. doc.LoadHtml(@html);
  5. //make some changes
  6. doSomething();
  7. //save the change
  8. var sb = new StringBuilder();
  9. using (var writer = new StringWriter(sb))
  10. {
  11. doc.Save(writer);
  12. }

Q: 如何去掉外层的html tag只留下内容?

A: 用remove方法。假设结点<a href=xxx>ABCD</a>,你想留下ABCD而不要<a></a>,那你需要先得到这个Html结点,假设叫link:

  1. link.ParentNode.RemoveChild(link,true);

参数true表示留下grandchild,在这里即内容ABCD; false表示将此结点连同其grandchilds一起删除。

规则有很多,网上提供了源代码,可以研究一下,还有源代码有乱码问题,是字符集的问题,只需要写一个方法来自动判断就可以解决了

开源项目Html Agility Pack实现快速解析Html的更多相关文章

  1. C# 网络爬虫利器之Html Agility Pack如何快速实现解析Html

    简介 现在越来越多的场景需要我们使用网络爬虫,抓取相关数据便于我们使用,今天我们要讲的主角Html Agility Pack是在爬取的过程当中,能够高效的解析我们抓取到的html数据. 优势 在.NE ...

  2. Python优秀开源项目Rich源码解析

    这篇文章对优秀的开源项目Rich的源码进行解析,OMG,盘他.为什么建议阅读源码,有两个原因,第一,单纯学语言很难在实践中灵活应用,通过阅读源码可以看到每个知识点的运用场景,印象会更深,以后写代码的时 ...

  3. 开源项目月刊《HelloGitHub》第 60 期

    兴趣是最好的老师,HelloGitHub 就是帮你找到兴趣! 简介 分享 GitHub 上有趣.入门级的开源项目. 这是一个面向编程新手.热爱编程.对开源社区感兴趣 人群的月刊,月刊的内容包括:各种编 ...

  4. Html Agility Pack 使用 XPath 选择器

    想做一个爬虫程序,以前用的一直使用CSS选择器的html解析插件,最近做的项目想使用 Html Agility Pack 来做解析 Html Agility Pack使用 XPath 和 Linq 来 ...

  5. 使用Html Agility Pack快速解析Html内容

    Html Agility Pack 是一个开源的.NET 方案HTML解析器. 开源地址:https://github.com/zzzprojects/html-agility-pack 用法:vs上 ...

  6. [c#] Html Agility Pack 解析HTML

    摘要 在开发过程中,很有可能会遇到这样的情况,服务端返回的是html的内容,但需要在客户端显示纯文本内容,这时候就需要解析这些html,拿到里面的纯文本.达到这样的目的可以有很多途径,比如自己写正则表 ...

  7. HTML Agility Pack:簡單好用的快速 HTML Parser

    HTML Agility Pack:簡單好用的快速 HTML Parser Codeplex 軟體套件(Package)資訊 套件名稱 HTML Agility Pack 作者 Simon Mouri ...

  8. Html Agility Pack 解析Html

    Hello 好久不见 哈哈,今天给大家分享一个解析Html的类库 Html Agility Pack.这个适用于想获取某网页里面的部分内容.今天就拿我的Csdn的博客列表来举例. 打开页面  用Fir ...

  9. Android开发周报:Flyme OS开源、经典开源项目解析

    Android开发周报:Flyme OS开源.经典开源项目解析 新闻 <魅族Flyme OS源码上线Github> :近日魅族正式发布了MX5,并且在发布会上,魅族还宣布Flyme OS开 ...

随机推荐

  1. Daily Scrum 10.27

    今天是星期天,但大家都没有放松,还是抽出了一定的时间来完成任务.可以感觉出来在编译作业的压力下大家的热情不是很高涨,希望大家坚持下去. 下面是今天的Task统计: 下面是所有迭代的状态:

  2. js 字符串拼接

    正常来说已经使用es6 的 模板了如`` //页面层 layer.open({ type: 1, content:`<div class="child_card"> & ...

  3. poj2115-C Looooops(扩展欧几里德算法)

    本题和poj1061青蛙问题同属一类,都运用到扩展欧几里德算法,可以参考poj1061,解题思路步骤基本都一样.一,题意: 对于for(i=A ; i!=B ;i+=C)循环语句,问在k位存储系统中循 ...

  4. vsftpd增加ssl安全验证

    查看vsftpd是否支持ssl ldd `which vsftpd`|grep ssl 输出 libssl.so.6 => /lib64/libssl.so.6 (0x00002ba684304 ...

  5. mac自定义安装nodejs步骤

    自定义安装的好处是nodejs相关的文件都在同一个文件夹下,且不与其它程序的文件混合在同一文件夹下. 1.下载node并解压缩:https://nodejs.org/dist/,选择tar.gz包下载 ...

  6. WCF初识

    WCF能干什么? 在win32中,应用程序是运行在进程的线程中的,.NET出现之后,出现了AppDomain,其实就相当于在进程和线程之间又又了一层包装层,类似于子进程的概念,在一个进程或者应用程序域 ...

  7. c#中浅拷贝和深拷贝的理解

    c#中拷贝有浅拷贝和深拷贝之分. 例如对象A,其中有值类型字段和引用类型字段: 1.浅拷贝: 对于值类型字段,直接逐位复制到新拷贝的副本对象中,修改副本的字段的值,不会影响源对象中字段的值: 对于引用 ...

  8. [curator] Netflix Curator 使用

    curator简介 Netflix curator 是Netflix公司开源的一个Zookeeper client library,用于简化zookeeper客户端编程,包含一下几个模块: curat ...

  9. 安装docker-compose

    下载到合适的位置 curl -L https://github.com/docker/compose/releases/download/1.8.0/docker-compose-`uname -s` ...

  10. Scala 环境搭建

    下载安装包 1,)下载java jdk,推荐jdk1.8; 2,)下载scala安装包:http://www.scala-lang.org/; 3,)下载IDE:ide可以选择两种: 3.1,)Sca ...