【记录】折腾C#中的HTML解析库:HtmlAglityPack

【背景】

之前就知道HtmlAglityPack,用于C#的html的解析:

【整理】C#中的HTML解析

之前对于C#的HTML解析,用的是另外的SGMLReader:

【记录】C#中的HTML解析

但是那个很不好用,尤其是,当html代码中,带xmlns时,还需要加上对应的xmlns的代码,类似于这样:

                curSearchInfo.xmlDoc = htmlToXmlDoc(curSearchInfo.searchRespHtml);

                curSearchInfo.m = new XmlNamespaceManager(curSearchInfo.xmlDoc.NameTable);
                curSearchInfo.m.AddNamespace("w3org", "http://www.w3.org/1999/xhtml");

                curSearchInfo.gigDataList = curSearchInfo.xmlDoc.SelectNodes("//w3org:div[@data-gig_id]", curSearchInfo.m);

用起来很是麻烦。

所以,现在去折腾折腾这个HtmlAglityPack,看看其是否好用。

【折腾过程】

1.找到主页:

http://htmlagilitypack.codeplex.com/

2. Html Agility Pack,简称HAP。

看了介绍,说是:

支持那种畸形的,不正常的html;

处理完后,使用xpath或xslt处理信息,查找内容;

3.从

http://htmlagilitypack.codeplex.com/releases/view/90925

下载到二进制的库文件:

HtmlAgilityPack.1.4.6.zip

然后在VS2010中新建一个C#项目用于测试,然后导入dll:

HtmlAgilityPack.1.4.6\Net20\HtmlAgilityPack.dll

 

4. 然后再参考:

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

Html Agility Pack

去写代码。

经过一番自己的测试,如下代码可以正常工作:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

using HtmlAgilityPack;

namespace htmlAgilityPackTest
{
    public partial class htmlAgilityPackTest : Form
    {
        public crifanLib crlLib;

        public htmlAgilityPackTest()
        {
            InitializeComponent();

            crlLib = new crifanLib();
        }

        private void htmlAgilityPackTest_Load(object sender, EventArgs e)
        {
            string testUrlWithXmlns = "http://sd.csdn.net/";

            string respHtml = crlLib.getUrlRespHtml(testUrlWithXmlns);

            //<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
            //<html xmlns="http://www.w3.org/1999/xhtml">
            //<head>

            HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
            doc.LoadHtml(respHtml);
            
            //<div class="tabcontent" id="sc1">
            //    <ul>
					 
            //    <li><a href="http://www.csdn.net/article/tag/%E4%BA%A7%E5%93%81" target="_blank">产品</a></li>
					 
            //    <li><a href="http://www.csdn.net/article/tag/%E5%88%9B%E4%B8%9A" target="_blank">创业</a></li>
					 
            //    <li><a href="http://www.csdn.net/article/tag/%E8%81%8C%E5%9C%BA" target="_blank">职场</a></li>
					 
            //    <li><a href="http://www.csdn.net/article/tag/%E4%BA%BA%E7%89%A9" target="_blank">人物</a></li>
					 
            //    <li><a href="http://www.csdn.net/article/tag/%E8%AE%BE%E8%AE%A1" target="_blank">设计</a></li>
            //                        </ul>
            //</div>
            //...
            //<div class="tabcontent" id="sc4">
            //    <ul>
					 
            //    <li><a href="http://www.csdn.net/article/tag/%E7%BC%96%E7%A8%8B%E8%AF%AD%E8%A8%80"  target="_blank">编程语言</a></li>
					 
            //    <li><a href="http://www.csdn.net/article/tag/%E5%BC%80%E6%94%BE%E5%B9%B3%E5%8F%B0"  target="_blank">开放平台</a></li>
					 
            //    <li><a href="http://www.csdn.net/article/tag/html5"  target="_blank">HTML5</a></li>
					 
            //    <li><a href="http://www.csdn.net/article/tag/%E5%89%8D%E7%AB%AF%E5%BC%80%E5%8F%91"  target="_blank">前端开发</a></li>
					 
            //    <li><a href="http://www.csdn.net/article/tag/%E6%99%BA%E8%83%BD%E7%AE%97%E6%B3%95"  target="_blank">智能算法</a></li>
					 
            //    <li><a href="http://www.csdn.net/article/tag/%E6%9E%B6%E6%9E%84"  target="_blank">架构</a></li>
					 
            //    <li><a href="http://www.csdn.net/article/tag/%E5%BC%80%E6%BA%90"  target="_blank">开源</a></li>
					 
            //    <li><a href="http://www.csdn.net/article/tag/%E6%95%B0%E6%8D%AE%E5%BA%93"  target="_blank">数据库</a></li>
            //                        </ul>
            //</div>


            //here, no need to take care the html xmlns
            //is better than SGMLReader
            HtmlNodeCollection htmlNodes = doc.DocumentNode.SelectNodes("//div[@class='tabcontent']");
            foreach (HtmlNode link in htmlNodes)
            {
                HtmlAttribute att = link.Attributes["id"];
                MessageBox.Show(att.Value); //work now -> here can got sc1 - sc4
            }
        }
    }
}

 

【总结】

HtmlAglityPack还是要比SGMLReader好用的。

至少不用操心那个html的xmlns。

不错,有空要好好发掘发掘其潜能。

 

注意:

1.旧的代码是doc.load(xxx)

此处必须换成doc.loadHtml(html)才可以。

2.此处的:

HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();

不能写成:

HtmlDocument doc = new HtmlDocument();

否则会提示:

HtmlDocument有歧义,因为默认的System.Windows.Forms下面也有个HtmlDocument。

3.我此处,不需要别人所提到的那个HtmlWeb,直接用我的html即可。

4.HtmlAgilityPack是有其自己一套的,类似于xml的,单独针对html的方法,比如:

HtmlNodeCollection

HtmlNode

等等,用法上,倒是和xml很相似的。不错。很好用。



发表评论

电子邮件地址不会被公开。 必填项已用*标注

无觅相关文章插件,快速提升流量