【背景】
之前就知道HtmlAglityPack,用于C#的html的解析:
之前对于C#的HTML解析,用的是另外的SGMLReader:
但是那个很不好用,尤其是,当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
去写代码。
经过一番自己的测试,如下代码可以正常工作:
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很相似的。不错。很好用。
转载请注明:在路上 » 【记录】折腾C#中的HTML解析库:HtmlAglityPack