2012-09-10 23:30 如何解决HtmlAgilityPack得到的InnerText中有残留的script、样式的问题

简介: 那么如何解决HtmlAgilityPack得到的InnerText中有残留的script、样式的问题呢,在google上搜索“HtmlAgilityPack script innerText”找到了stackoverflow上的这篇文章《C#: HtmlAgilityPack extract inner text》 代码如下:   foreach(varscript indoc.

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

代码如下:

 
foreach(varscript indoc.DocumentNode.Descendants("script").ToArray())
script.Remove();
foreach(varstyle indoc.DocumentNode.Descendants("style").ToArray())
style.Remove();

stringinnerText = doc.DocumentNode.InnerText;
 

 

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

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

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

 

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

代码如下:

 
foreach(varscript indoc.DocumentNode.Descendants("script").ToArray())
script.Remove();
foreach(varstyle indoc.DocumentNode.Descendants("style").ToArray())
style.Remove();

foreach(varcomment indoc.DocumentNode.SelectNodes("//comment()").ToArray())
comment.Remove();//新增的代码

stringinnerText = 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标签。

 

 XPath 使用路径表达式来选取 XML 文档中的节点或节点集。节点是通过沿着路径 (path) 或者步 (steps) 来选取的。

 nodename:选取此节点的所有子节点。 
 /:从根节点选取。 
 //:从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。 
 .:选取当前节点。 
 ..:选取当前节点的父节点。

参考资料:

http://www.w3school.com.cn/xpath/xpath_syntax.asp 

#c#
相关文章
|
JavaScript 前端开发 程序员
javascript插件库的应用:mapper.js实现图片热点的hover高亮效果
javascript插件库的应用:mapper.js实现图片热点的hover高亮效果
189 0
|
前端开发 JavaScript
webpack优化篇(四十八):使用 Tree Shaking 擦除无用的 JavaScript 和 CSS
webpack优化篇(四十八):使用 Tree Shaking 擦除无用的 JavaScript 和 CSS
283 0
webpack优化篇(四十八):使用 Tree Shaking 擦除无用的 JavaScript 和 CSS
|
JavaScript
《跟热饭一起学习vue吧》Part.2 插入html
《跟热饭一起学习vue吧》Part.2 插入html
《跟热饭一起学习vue吧》Part.2 插入html
|
JavaScript 数据安全/隐私保护
JavaScrip 修改样式属性 js简单案例
JavaScrip 修改样式属性 js简单案例
135 0
|
Web App开发 前端开发 JavaScript
Js实现粘贴板中写入text
很久不写前端代码了,最近整一个chrome插件时,希望将数据保存到粘贴版,试了好几种方式,结果发现都不太好使,直接基于输入框来实现赋值粘贴可行,若直接往粘贴板中写数据却没试出来;作为一个前端菜鸟就只能猥琐一点的实现了
716 0
Js实现粘贴板中写入text
|
JavaScript 前端开发
jQuery翻页yunm.pager.js,涉及div局部刷新(1)
jQuery翻页yunm.pager.js,涉及div局部刷新
173 0
jQuery翻页yunm.pager.js,涉及div局部刷新(1)
|
JavaScript
jQuery翻页yunm.pager.js,涉及div局部刷新(2)
jQuery翻页yunm.pager.js,涉及div局部刷新
133 0
|
JavaScript 前端开发
使用SUI与JQuery冲突的解决方法
在使用SUI的过程中同样需要用到依赖jquery的jquery.form.js,而SUI中的zepto.js与jquery冲突。需要解决这个问题来使自己项目中的图片上传功能能够正常使用。
5929 0