一款很不错的html转xml工具-Html Agility Pack

原文:一款很不错的html转xml工具-Html Agility Pack

  之前发个一篇关于实现html转成xml的劣作《实现html转Xml》,受到不少网友的关心。该实现方法是借助htmlparser去分解html内容,然后按照dom的结构逐个生成xml字符串。在没有充分实践后,还以为该方案能解决问题。然而经过实际使用,效率确实很低,而且对一些特殊html属性的转换也不支持,得到的结果差强人意。

  偶然一次机会在浏览codeplex网站时,发现一款很不错的html解析以及转换工具,就是本篇标题所提到的Html Agility Pack。Html Agility Pack是codeplex里的一款开源框架,其主要功能是利用对象模型去操作html内容,能够把xpath等xml方面的技术简单、灵活地应用在html文档解析中。正如其介绍所说的那样,该框架非常适合用于开发爬虫,网络数据挖掘工具。更重要的是该框架完全由c#语言编写,便于对框架的修改和深入的研究。

  下面来看看如何将html转换成xml格式

  首先创建一个HtmlDocument对象(该HtmlDocument是Html Agility Pack中的类,并不是winform里的那个),所有的对html的操作都通过这个对象实现。

HtmlDocument htmlDoc = new HtmlDocument();

接着设置输出成xml的一些选项

//输出成xml格式
htmlDoc.OptionOutputAsXml = true;

加载html字符串内容,同时输出转换结果

// 加载html内容
htmlDoc.LoadHtml(@"<html><body>
<table>
         <tr>
         <td>dafd</td>
         <td>
         </tr>
  </table>
</body></html>");

 // 将输出结果保存到字符串流中
  StringBuilder sbXml = new StringBuilder();
  StringWriter sw = new StringWriter(sbXml);
  htmlDoc.Save(sw);

 Console.WriteLine(sbXml.ToString());

提供的html内容并不是良好格式的xml,转换之后的结果:

<?xml version="1.0" encoding="gb2312"?>
<html>
<body>
                <table>
                    <tr>
                        <td>dafd</td>
                        <td></td>
                    </tr>
                </table>
</body>
</html>

转换之后,自动修复了没有匹配标记,并且加上了xml的声明。

另外在使用的时候,如果给定的html文档内容没有根节点,那么转换之后会自动添加一个名称为span的根节点。

比如输入的html文档如下:

<script>var b ='b';</script>
<html><body>
                <table>
                    <tr>
                        <td>dafd</td>
                        <td>
                    </tr>
                </table>
                </body>
</html>

转换结果如下:

<?xml version="1.0" encoding="gb2312"?><span><script>
//<![CDATA[
var b ='b';
//]]>//
</script><html><body>
                <table>
                    <tr>
                        <td>dafd</td>
                        <td>
                    </td></tr>
                </table>
                </body></html></span>

这种方式保证了转换时的安全,是否使用还是看具体的项目要求。

  以上方式是给定了已有的html字符串,还有另外一种更加方便的方式,那就是直接给出url路径,利用HtmlWeb就能包办下载以及转换的功能。实现方式如下:

            StringBuilder sbXml = new StringBuilder();
            StringWriter sw = new StringWriter(sbXml);
            XmlTextWriter tw = new XmlTextWriter(sw);

            HtmlWeb htmlWeb = new HtmlWeb();
            htmlWeb.LoadHtmlAsXml("http://htmlagilitypack.codeplex.com/", tw);

            Console.WriteLine(sbXml.ToString());

以上方式虽然方便,但是有一个不稳定的因素是:下载过来的html文档很有可能是乱码,并确实存在这种情况,为了更好的使用,我修改了下源代码,让其在下载的时候就能自动判断编码方式。

  Html Agility Pack的效率比htmlparser有了很大的提升。但是在处理一些超大页面时,还是要有一些等待。另外还有一个美中不足的是,转换的结果还是不能100%地符合表中html格式的内容,只能说是95%地接近,比起firebug的html解析功能还差的远。

 

Html Agility Pack的下载链接

http://htmlagilitypack.codeplex.com/ 

修改过的dll(修复文档下载后乱码的问题)

 HtmlAgilityPack_Shenba

 

 

 

 

 

 

 

时间: 2024-09-19 08:20:10

一款很不错的html转xml工具-Html Agility Pack的相关文章

10款很棒的浏览器兼容性测试工具

  对于前端开发工程师来说,确保代码在各种主流浏览器的各个版本中都能正常工作是件很费时的事情,幸运的是,有很多优秀的工具可以帮助测试浏览器的兼容性,让我们一起看看这些很棒的工具. Spoon Browser Sandbox 点击你需要测试的浏览器环境,安装插件就可以进行测试了.帮助你测试网页在Safari.Chrome.Firefox和Opera浏览器中是否正常,IE以前也有的,网站上说应微软的要求去掉了. Superpreview 这是为微软自己发布的跨浏览器测试工具,您可以同时查看您的网页在

提供一款很不错的万年历查询_时间日期

万年历查询 公历: 年 月 阴历: 年 月 http://www.windstudio.net/calendar.htm####">返回当前月份 当前时间: 9 3 4 8 日 一 二 三 四 五 六

RubyCritic:一款不错的检测代码质量工具

关注代码质量是高效开发必须要做的一件事,那么在 Ruby 开发的过程中,是否有什么好的代码质量检测工具呢?下面由 Ruby 工程师路英瑞介绍一下 RubyCritic--一款还不错的代码质量检测工具. 最近在开发 Cloud Insight API(一款能够优雅监控多种操作系统.数据库.中间件.云主机的解决方案) 时,发现一个可以检测 Ruby 代码质量的工具-RubyCritic. RubyCritic 集成 Reek, Flay 和 Flog 这3个分析代码的工具,能够对你的 Ruby 代码

12 个很棒的 PHP 资源和工具

本文介绍 12 款很棒的 PHP 资源和工具,包括开发框架.开发工具.调试器等. 1. CakePHP CakePHP是一个运用了诸如ActiveRecord.Association Data Mapping.Front Controller和MVC等著名设计模式的快速开发框架.该项目主要目标是提供一个可以让各种层次的PHP开发人员快速地开发出健壮的Web应用,而 又不失灵活性. 2. Zend Studio Zend Studio 是专业开发人员在使用PHP整个开发周期中唯一的集成开发环境 (

很不错的两款Bootstrap Icon图标选择组件_javascript技巧

一.Bootstrap icon picker组件 这个组件是在github上面搜索的时候找到的,初初看上去,确实是很不错的,并且是基于bootstrap风格的,所以更加适合使用bootstrap风格布局的项目.既然是github上面的,毋庸置疑,这是一个开源组件,源码地址.好了,说了这么多,一起来看看它到底长啥样子吧. 1.组件效果预览 第一次初始化 支持"上一页"和"下一页" 支持自定义图标的选择 支持模糊搜索图标,比如我们搜索camera 选择图标后对应的样式

《捕鱼达人2》都是一款很受用户欢迎的产品

不论是在谷歌Android平台上,还是苹果iOS平台上,<捕鱼达人2>都是一款很受用户欢迎的产品.今日上午,触控科技总经理陈昊芝在微博上发表博文表示,<捕鱼达人2>在2013年2月份为公司带来的月收入或将超过3000万元,而目前单日收入已稳定在100万元以上.陈昊芝透露,<捕鱼达人2>在去年8月和12月分别入驻中国电信游戏基地和中国移动游戏基地之后,已于今年正式进入中国联通平台,而其仅在中国移动游戏基地的来看,小米.联想.OPPO等国产品牌用户活跃率较高,而国际大厂,除

几个很不错的.NET 相关的FAQ和例子代码的连接

几个很不错的.NET 相关的FAQ和例子代码的资源,推荐一下,如果大家已经知道了可不要笑话我 Mike Woodring's .NET Sample Page George Shepherd's Windows Forms FAQ? Ingo Rammer's (thinktecture) .NET Remoting FAQ Jeff Key's .NET Stuff ?

Civo是一款很浪漫的应用

摘要: 在我看来,Civo是一款很浪漫的应用.因为它的创意本身就来自于一个浪漫的念头:交换生活. 生活在别处,这句来自法国诗人兰波的诗句,几乎表达出人这一生最浪漫的情怀.可是撇 在我看来,Civo是一款很浪漫的应用.因为它的创意本身就来自于一个浪漫的念头:交换生活. 生活在别处,这句来自法国诗人兰波的诗句,几乎表达出人这一生最浪漫的情怀.可是撇去旅游式的走马观花,谁又能有多少机会在不同的地方细细品味?Civo要做的事就是如此,在一个私密.安静的环境里,用照片的方式,记录并交换远隔千里的生活.不必

很不错的文章---【问底】徐汉彬:亿级Web系统搭建——单机到分布式集群

原文:很不错的文章---[问底]徐汉彬:亿级Web系统搭建--单机到分布式集群 [导读]徐汉彬曾在阿里巴巴和腾讯从事4年多的技术研发工作,负责过日请求量过亿的Web系统升级与重构,目前在小满科技创业,从事SaaS服务技术建设.  大规模流量的网站架构,从来都是慢慢"成长"而来.而这个过程中,会遇到很多问题,在不断解决问题的过程中,Web系统变得越来越大.并且,新的挑战又往往出现在旧的解决方案之上.希望这篇文章能够为技术人员提供一定的参考和帮助.  以下为原文 当一个Web系统从日访问量