[转帖]向HtmlAgilityPack道歉:解析HTML还是你好用

2012-02-07 22:25  3106人阅读  评论(4)  收藏  举报

去年写过一篇文章《解析HTML最好的类还是微软自己的》(http://www.cnblogs.com/rupeng/archive/2010/06/26/1765840.html),回复中有朋友提到可以使用HtmlAgilityPack来进行HTML的解析。当时只是匆匆的测试了一下,发现HtmlAgilityPack得到的InnerText中有很多的不干净的script、样式内容,就断定“不是很满意,解析DiscuzNT!论坛的帖子页面的时候有问题,没法正确得到Body.InnerText的内容,有很多残留html、js代码夹杂在其中,解析的不是很好。”

 

传智播客.net培训学院内部有一个工具是我开发的,其中的HTML解析部分就是我使用MSHTML完成的,但是今天发现这个软件一个Bug,是MSHTML的HTMLDocumentClass在多线程并发时候有时候会造成死锁。MSHTML是工作在UI线程中的(如果不把DesignMode设置为On,则HTML中的javascript会被执行就是证明),并不是一个干净的、独立的HTML解析组件,因此出现这样的问题很难调试。因此决定还是换用MSHTML实现。


那么如何解决HtmlAgilityPack得到的InnerText中有残留的script、样式的问题呢,在google上搜索“HtmlAgilityPack script innerText”找到了stackoverflow上的这篇文章《C#: HtmlAgilityPack extract inner text》http://stackoverflow.com/questions/2785092/c-htmlagilitypack-extract-inner-text

代码如下:

foreach(var script in doc.DocumentNode.Descendants("script").ToArray()) script.Remove();foreach(var style in doc.DocumentNode.Descendants("style").ToArray()) style.Remove(); stringinnerText = doc.DocumentNode.InnerText;
 

原来这样简单呀,就是把所有的script、style标签从dom树中去掉(为了解决迭代器在工作时不能从集合中Remove元素的问题,使用ToArray()转换为数组再遍历)。

这样操作发现还是有残留的script:

<!--[if IE]> <script language="JavaScript"> var objmain = document.getElementById("main"); functionupdatesize(){ var bodyw = window.document.body.offsetWidth; var w=(bodyw<=790?"790px":"100%"); objmain.style.width=w; } updatesize(); window.onresize = updatesize; </script> <![endif]-->

 

仔细一看原来是带条件注释的script,因此用下面的方法去掉所有的注释节点:

代码如下:

foreach(var script in doc.DocumentNode.Descendants("script").ToArray()) script.Remove();foreach(var style in doc.DocumentNode.Descendants("style").ToArray()) style.Remove(); foreach (varcomment in doc.DocumentNode.SelectNodes("//comment()").ToArray()) comment.Remove();//新增的代码string innerText = doc.DocumentNode.InnerText;

 

解释:HtmlAgilityPack是使用XPath语法,"//comment()"在XPath中表示“所有注释节点”,关于XPath的详细用法请参考XPath的资料。

其他可能有用的技术点:
1、获取网页title:doc.DocumentNode.SelectSingleNode("//title").InnerText; 
解释:XPath中“//title”表示所有title节点。SelectSingleNode用于获取满足条件的唯一的节点。


2、获取所有的超链接:doc.DocumentNode.Descendants("a")


3、获取name为kw的input,也就是相当于getElementsByName():
            var kwBox = doc.DocumentNode.SelectSingleNode("//input[@name='kw']");

解释:"//input[@name='kw']"也是XPath的语法,表示:name属性等于kw的input标签。

 

经过这次使用HtmlAgilityPack得出结论:还是HtmlAgilityPack强大!!!再见MSHTML!

转载于:https://www.cnblogs.com/jadepark/archive/2012/02/17/2356465.html

因为许多原因,开心网址已经停止开发,这个程序从一开始只是作为学习asp的练习作, 只是一时兴趣,从没有想到会得到这么多朋友的支持,许多朋友现在还在使用着这个程序。从一开始的asp到后来生成html,中间有着许许多多的漏洞,给很多朋友带来了麻烦,希望朋友们能够原谅。 程序的代码一直都是杂乱无章,因为作者本身只是一个asp的外行,只是本着学习的兴趣和使用的方便,没有考虑到很多其他的问题。每次发布都是拿自己的网站代码匆匆发布,有着很多杂七杂八的广告,也给很多朋友带来了不便,对此再一次对大家道歉。 从一年前在自己的电脑上第一次装linux到现在,基本上没有再碰过asp的代码(php正在学习中)。很多命令已经陌生了,所以这次整理代码,可能会出现很多错误,希望大家能及时反应,以便及时更改,给这个程序画一个圆满的句号。 因为贴吧,网摘都是在以前网上流传的几个程序上进行的修改,原作者已经不详,很多语句都没有仔细的看,而且模板修改也比较麻烦,所以一直都没有随程序发布,很多朋友想要,这次一并送上,可能需要修改的地方很多,请大家仔细研究。这次最后发布的版本与作者自己的网站完全相同,可能有许多多余的东西,可以根据自己的需要进行删除。 Asp代码+Access数据库+fso组件,请在支持asp和fso组件的环境下运行 版权说明 开心网址FinalVersion版程序源码属于免费源码,所有人可以下载,修改,使用以及传播,源码中没有任何限制功能,但是出于对作者劳动的尊重,希望您能保留网页底部的版权信息。 开心网址程序目前没有收费想法,但所有把本程序,或修改自本程序的源码收费提供给其他网友的做法,我们保留追究法律责任的权利。 开心网址FinalVersion版程序源码265风格的css文件和图片均来源于265网址导航(http://www.265.com)。 注意事项 后台管理登陆界面默认地址是:http://你的域名/admin 默认管理员帐号admin密码admin管理认证码happywz注意及时更改 为了网站安全,发布前一定要做的事: 1.修改后台管理文件夹名(admin文件夹) 2.修改数据库地址(data文件夹名和#data.asa文件名) 3.将mdb.asp中的数据库地址改为修改后的数据库相对于根目录的地址,sessionvar改为任意字符(作为你网站的唯一标识符),修改管理认证码,如果你的网站fso组件名称与默认不同,则还要修改fso组件的名称。 4.理论上,网址分类是可以无限层,但是为了网页美观,左侧的分类列表现在只支持3级分类,所以不推荐建立3级以上的分类。 网址部分功能 1.可以设置网站的名称,地址,信箱,管理员,88*31LOGO图片,首页180*60LOGO图片,关键字,网站描述等基本信息。 2.广告信息管理功能,所有广告都可以通过开关设置显示或隐藏。广告类型支持图片,flash,js代码,以及自写代码。注意把广告Js调用代码放置在需要位置。 3.导航条可以从后台进行添加,删除或者修改的管理。 4.数据库管理功能,可以在线备份,恢复,压缩数据库,以及用Sql语句批量处理数据。 5.超级管理员功能,可以增加高级管理员和数据输入员,各有不同功能限制。 6.支持网址N级分类,管理员可以后台对类别,网址进行添加,删除,修改和审核管理。 7.可以设置登录模式为自助登录或邮箱登录. 8.生成html功能,审核新入网址后请更新网址列表,并按分类重新生成html网页。注意在添加修改网址及添加修改分类后重新生成一遍网页。 9.在线编辑网页功能,随心所欲的设计所有页面。 10.最新更新2万条网址数据 11.sql防注入功能,可以锁定ip。 12.某些网站为了安全,将FSO组件的名称进行更改以达到禁用FSO的目的。这样html生成功能将无法使用,如果你的网站属于这种情况,可以到mdb.asp中更改FSO组件名称。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值