向HtmlAgilityPack道歉:解析HTML还是你好用
教程管理员 发布于2023-09-30 22:19 HTML教程 154
原文:http://www.cnblogs.com/rupeng/archive/2012/02/07/2342012.html
去年写过一篇文章《解析HTML最好的类还是微软自己的》,回复中有朋友提到可以使用HtmlAgilityPack来进行HTML的解析。当时只是匆匆的测试了一下,发现HtmlAgilityPack得到的InnerText中有很多的不干净的script、样式内容,就断定“不是很满意,解析DiscuzNT!论坛的帖子页面的时候有问题,没法正确得到Body.InnerText的内容,有很多残留html、js代码夹杂在其中,解析的不是很好。”
传智播客.net培训学院内部有一个工具是我开发的,其中的HTML解析部分就是我使用MSHTML完成的,但是今天发现这个软件一个Bug,是MSHTML的HTMLDocumentClass在多线程并发时候有时候会造成死锁。MSHTML是工作在UI线程中的(如果不把DesignMode设置为On,则HTML中的javascript会被执行就是证明),并不是一个干净的、独立的HTML解析组件,因此出现这样的问题很难调试。因此决定还是换用向HtmlAgilityPack实现。
那么如何解决HtmlAgilityPack得到的InnerText中有残留的script、样式的问题呢,在google上搜索“HtmlAgilityPack script innerText”找到了stackoverflow上的这篇文章《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();
string innerText = doc.DocumentNode.InnerText;
原来这样简单呀,就是把所有的script、style标签从dom树中去掉(为了解决迭代器在工作时不能从集合中Remove元素的问题,使用ToArray()转换为数组再遍历)。
这样操作发现还是有残留的script:
<!--[if IE]>复制代码
<script language="JavaScript"> var objmain = document.getElementById("main"); function updatesize(){ 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 (var comment 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!
本文转自火地晋博客园博客,原文链接:http://www.cnblogs.com/yelaiju/archive/2012/02/13/2349213.html,如需转载请自行联系原作者
相关推荐
- 10-04 在HTML中取得请求中的参数
- 10-04 SharePoint 2013 母版页取消和HTML页关联
- 10-04 29行代码使用HTML5 Canvas API绘制一颗红心
- 10-04 浏览器加载和渲染html的顺序,Div和Table的区别
- 10-04 《HTML5完美游戏开发》——2.6 Processing.js实例和整合
- 10-04 如何关闭Struts2的webconsole.html
- 10-04 《HTML5 开发实例大全》——1.4 使用CSS修饰HTML 5页面
- 10-04 《HTML5游戏编程核心技术与实战》——2.8 小结
- 10-04 腾讯视频生成的Html代码
- 10-04 ie下tbody的innerhtml属性只读
- 控制面板
- 友情链接
- 最近发表
-
- 涂鸦而不乱简约艺术主题Office PPT免费模板背景素材下载
- 有创意的情人表白动态贺卡Office PPT免费模板背景素材下载
- 绿色简约技能竞赛电力Office PPT免费模板背景素材下载
- 极简几何商务蓝年终总结汇报Office PPT免费模板背景素材下载
- 蓝橙简约商务年终总结汇报Office PPT免费模板背景素材下载
- 绿色清新教育风课堂教学通用Office PPT免费模板背景素材下载
- 潮流复古艺术感年终总结Office PPT免费模板背景素材下载
- 浅绿商务风工作总结报告Office PPT免费模板背景素材下载
- 大气简约时尚年终总结汇报Office PPT免费模板背景素材下载
- 喜庆春节风公司年终誓师表彰大会Office PPT免费模板背景素材下载
- 最新留言
-