解析HTML最好的类还是微软自己的

来源:互联网 发布:windows wdf驱动开发 编辑:程序博客网 时间:2024/05/18 04:01

我主讲的课程下周要开始讲站内搜索的项目,其中已经重要的技术点是进行HTML的解析,发现程序运行非常慢,一开始以为是lucence的问题,一测试大吃一惊,每一步lucence中AddDocument等只用了几十毫秒,而HTML解析竟然用了9秒。
日志如下:
2010-06-26 15:51:25,171 [8] DEBUG SearchSite.StartIndex - DownloadString:00:00:00.0482329
2010-06-26 15:51:34,187 [8] DEBUG SearchSite.StartIndex - ThreadParser:00:00:09.0236490
2010-06-26 15:51:34,187 [8] DEBUG SearchSite.StartIndex - DeleteDocuments:00:00:00.0000069
2010-06-26 15:51:34,203 [8] DEBUG SearchSite.StartIndex - AddDocument:00:00:00.0191071

我使用的是Winista.HtmlParser这块网上找到的HTML解析器。遂准备更换解析器,但是用“.Net HTML Parser”在google上寻找,一直没找到合适的解析器,不是太难用,就是性能比Winista.HtmlParser还差。看到http://www.eggheadcafe.com/articles/parsinghtml.asp 这篇文章,我才想到,微软的MSHTML不就是用来解析HTML的吗?折腾这么一圈却忘了微软自家的东西,微软的东西性能肯定差不了。
添加对Microsoft.mshtml这个程序集的引用,然后编写如下代码:
IHTMLDocument2 doc = new HTMLDocumentClass();
            doc.write(new object[]{pageSource});
            doc.close();
            Title = doc.title;
            Body = doc.body.innerText;
再测试,哇咔咔,快的要命,只有几十毫秒,2000个帖子一会儿就爬完了。
日志如下:
2010-06-26 16:26:35,546 [8] DEBUG SearchSite.StartIndex - DownloadString:00:00:00.0400263
2010-06-26 16:26:35,562 [8] DEBUG SearchSite.StartIndex - ThreadParser:00:00:00.0257731
2010-06-26 16:26:35,562 [8] DEBUG SearchSite.StartIndex - DeleteDocuments:00:00:00.0001913
2010-06-26 16:26:35,578 [8] DEBUG SearchSite.StartIndex - AddDocument:00:00:00.0010881
HTMLDocumentClass的方法比任何一个网上找到的HTML解析器都丰富,想怎么搞就怎么搞,而且调用方法就是操作Dom的方法,完全不用再去学,哇咔咔,爽呆了。

在使用的过程中遇到两个问题:
1、VS2010中引用Microsoft.mshtml之后,要修改这个引用的“嵌入互操作类型”为False。
2、调用doc.write方法的时候必须通过IHTMLDocument2接口来调用,否则报错“错误的类型”,在google上搜“type mismatch HTMLDocument write”发现这篇帖子http://www.vistax64.com/powershell/95133-how-powershell-parse-htmldocument.html ,提到必须通过IHTMLDocument2接口来调用,不明白为什么,没深入研究。