博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
开源项目Html Agility Pack实现快速解析Html
阅读量:4982 次
发布时间:2019-06-12

本文共 3277 字,大约阅读时间需要 10 分钟。

这是个很好的的东西,以前做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.     
  4. HtmlNodeCollection hrefList = doc.DocumentNode.SelectNodes(".//a[@href]");    
  5.     
  6. if (hrefList != null)    
  7. {    
  8.      foreach (HtmlNode href in hrefList)    
  9.      {    
  10.         HtmlAttribute att = href.Attributes["href"];    
  11.         doSomething(att.Value);    
  12.     
  13.      }    
  14.     
  15. }    

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

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

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

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

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

node.InnerText.Trim() node.InnerHtml node.OuterHtml

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

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

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

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

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

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

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);    

<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存在字符串中:

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

//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:

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

link.ParentNode.RemoveChild(link,true);

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

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

转载于:https://www.cnblogs.com/ttlive/archive/2011/09/10/2173210.html

你可能感兴趣的文章
1.1 回调函数
查看>>
多个对象转成对象形式的数组
查看>>
MySQL 5.7 SYS scheme解析
查看>>
自定义DB连接池实现
查看>>
vs2010 工程设置,调试中的目录问题【转】http://www.cnblogs.com/mlj318/archive/2011/10/09/2203510.html...
查看>>
wp7的数据库并发异常
查看>>
abiword Namespace List
查看>>
C# XML 序列化 及 反序列化
查看>>
求素数
查看>>
怎么理解“平均负载”? 进行分析等
查看>>
java注解
查看>>
JSP页面格式化货币金额,千分位
查看>>
创建一个随机对象列表
查看>>
省市联动 js
查看>>
常用HTTP状态码
查看>>
WebAPI GET和POST请求的几种方式
查看>>
re 模块 常用正则表达式符号 最常用的匹配语法
查看>>
JavaScript代码存放位置
查看>>
python bs4结合数据库用法
查看>>
CentOS6.6安装vmware workstation报错
查看>>