【转】一款很不错的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

一款很不错的html转xml工具-Html Agility Pack 实现html转Xml的更多相关文章

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

    之前发个一篇关于实现html转成xml的劣作<实现html转Xml>,受到不少网友的关心.该实现方法是借助htmlparser去分解html内容,然后按照dom的结构逐个生成xml字符串. ...

  2. C#不用union,而是有更好的方式实现 .net自定义错误页面实现 .net自定义错误页面实现升级篇 .net捕捉全局未处理异常的3种方式 一款很不错的FLASH时种插件 关于c#中委托使用小结 WEB网站常见受攻击方式及解决办法 判断URL是否存在 提升高并发量服务器性能解决思路

    C#不用union,而是有更好的方式实现   用过C/C++的人都知道有个union,特别好用,似乎char数组到short,int,float等的转换无所不能,也确实是能,并且用起来十分方便.那C# ...

  3. 分享15款很实用的 Sass 和 Compass 工具

    Sass 是 CSS 的扩展,增加了嵌套规则,变量,混入功能等很多更多.它简化了组织和维护 CSS 代码的成本.Compass 是一个开源的 CSS 框架,使得使用 CSS3 和流行的设计模式比以往任 ...

  4. 优秀工具推荐:两款很棒的 HTML5 游戏开发工具

    HTML5 众多强大特性让我们不需要多么高深技术就能创建好玩的网页游戏,同时证明了开放的 Web 技术能与任何其他在游戏开发中使用的技术竞争.正如标题所说,这篇文章推荐的几款很棒 HTML5 游戏开发 ...

  5. 为大家推荐一款很不错的MarkDown编辑器——stackEdit

    自己细致体验了一下下:认为它还是很不错的! !! https://stackedit.io 这是它的官网,我们能够在chrome浏览器的"应用"里找到相应的插件. ps:它但是一款 ...

  6. [aspnetcore.apidoc]一款很不错的api文档生成工具

    AspNetCore.ApiDoc 简单徐速一下为什么选用了aspnetcore.apidoc 而没有选用swagger 最初我们也有在试用swagger,但总是有些感觉,感觉有点不满意,就但从api ...

  7. AspNetCore.FileLog 一款很不错的日志记录工具

    AspNetCore.FileLog 该项目作者为伟哥,GitHub地址:https://github.com/amh1979:该项目维护者为鸟窝,GitHub地址:https://github.co ...

  8. 一款很不错的FLASH时种插件

    直接贴一段代码上来,大家看看效果: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" " ...

  9. 很不错的点餐系统应用ios源代码完整版

    该源代码是一款很不错的点餐系统应用,应用源代码齐全,执行起来很不错,基本实现了点餐的一些经常使用的功能,并且界面设计地也很不错,是一个不错的ios应用学习的样例,喜欢的朋友能够下载学习看看,很多其它i ...

随机推荐

  1. html5plus 从相册选择图片后获取图片的大小

    plus.gallery.pick(function (filePath) { plus.io.resolveLocalFileSystemURL(filePath, function (entry) ...

  2. activity的23张表

    --二进制数据表 SELECT * FROM act_ge_bytearray; --属性数据表存储整个流程引擎级别的数据,初始化表结构时,会默认插入三条记录, SELECT * FROM act_g ...

  3. SpringMVC-注解映射器和适配器_20190323

    1 注解映射器和适配器 1.1 注解映射器spring3.1之前默认加载映射器是org.springframework.web.servlet.mvc.annotation.DefaultAnnota ...

  4. 路飞学城Python-Day10

    [37.函数-命名空间]命名空间又称为name space,顾名思义就是存放名字的地方,存什么名字呢?举例说明,若变量 x = 1,存放于内存中,那名字x存放在哪里呢?名称空间正式存放名字x和1绑定关 ...

  5. continue和break

    <script type="text/javascript"> var i=1; computer: while(true){ i++; switch(i){ case ...

  6. Python中编写精美图形界面(PyQt5)

    纯代码,布局的讲解 见: https://cloud.tencent.com/developer/article/1345469 Qt designer设计文件 .ui转 .py文件,进阶使用 注:不 ...

  7. wepy框架的API的预加载$preload这功能阔以喔

    优势:比 url 传递.或是 storage .或是 globalData 更方便 1:如 url 不能直接传一个 Object 要传的又要序列化与反序列化操作,麻烦(普通的单个变量还是挺便捷简单实在 ...

  8. LightOJ-1220 Mysterious Bacteria 唯一分解定理 带条件的最大公因数

    题目链接:https://cn.vjudge.net/problem/LightOJ-1220 题意 给x=y^p,问p最大多少 注意x可能负数 思路 唯一分解定理,求各素因数指数的GCD 注意负数的 ...

  9. 紫书 习题 11-4 UVa 1660 (网络流拆点法)

    这道题改了两天-- 因为这道题和节点有关, 所以就用拆点法解决节点的容量问题. 节点拆成两个点, 连一条弧容量为1, 表示只能经过一次. 然后图中的弧容量无限. 然后求最小割, 即最大流, 即为答案. ...

  10. 紫书 习题8-3 UVa 12545 (构造法)

    参考了https://blog.csdn.net/catglory/article/details/47188949 最后推出来操作的个数为问号的个数 加上 同一位置上S串为0而T串为1的位置数量 与 ...