zoukankan      html  css  js  c++  java
  • 一款很不错的html转xml工具-Html Agility Pack 实现html转Xml

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

    纸上得来终觉浅,绝知此事要躬行。
  • 相关阅读:
    玩转动态编译
    [源码]RandomId 生成随机字符串
    玩转动态编译:四、封装
    玩转动态编译:三、提高性能,抛弃反射
    玩转动态编译:一、初识
    封装和内置函数property classmethod staticmethod
    面向对象--命名空间和组合
    初始面向对象
    模块之序列化模块和包
    模块 time模块 sys模块 os模块
  • 原文地址:https://www.cnblogs.com/coky/p/6702721.html
Copyright © 2011-2022 走看看