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#
相关文章
|
5月前
|
前端开发 JavaScript
文本,wangEditor5展示HTML无样式,wangEditor5如何看源码,Ctrl + U看CSS文件,代码高亮,Prism.js可以实现,解决方法,参考网页源代码的写法
文本,wangEditor5展示HTML无样式,wangEditor5如何看源码,Ctrl + U看CSS文件,代码高亮,Prism.js可以实现,解决方法,参考网页源代码的写法
|
前端开发 JavaScript
webpack优化篇(四十八):使用 Tree Shaking 擦除无用的 JavaScript 和 CSS
webpack优化篇(四十八):使用 Tree Shaking 擦除无用的 JavaScript 和 CSS
295 0
webpack优化篇(四十八):使用 Tree Shaking 擦除无用的 JavaScript 和 CSS
|
JavaScript
《跟热饭一起学习vue吧》Part.2 插入html
《跟热饭一起学习vue吧》Part.2 插入html
《跟热饭一起学习vue吧》Part.2 插入html
|
Web App开发 JavaScript 前端开发
JavaScript 技术篇-chrome浏览器读取剪切板命令document.execCommand(‘paste‘)返回false原因及解决方法
JavaScript 技术篇-chrome浏览器读取剪切板命令document.execCommand(‘paste‘)返回false原因及解决方法
944 0
JavaScript 技术篇-chrome浏览器读取剪切板命令document.execCommand(‘paste‘)返回false原因及解决方法
|
JavaScript 前端开发
jQuery翻页yunm.pager.js,涉及div局部刷新(1)
jQuery翻页yunm.pager.js,涉及div局部刷新
179 0
jQuery翻页yunm.pager.js,涉及div局部刷新(1)
|
JavaScript
jQuery翻页yunm.pager.js,涉及div局部刷新(2)
jQuery翻页yunm.pager.js,涉及div局部刷新
136 0
|
JavaScript 前端开发
FullPage.js全屏插件文档及使用方法
简介 fullPage.js是一个基于jQuery的全屏滚动插件,它能够很方便、很轻松的制作出全屏网站 下载地址 下载地址 相关示例:基于fullpage.js实现的360全屏滑动效果 支持功能 支持鼠标滚动 支持前进后退和键盘控制 多个回调函数 支持手机、平板触摸事件 支持 CS...
2528 0
|
JSON 前端开发 JavaScript
JS组件系列——BootstrapTable 行内编辑解决方案:x-editable
阅读目录 一、x-editable组件介绍 二、bootstrapTable行内编辑初始方案 三、bootstrapTable行内编辑最终方案 1、文本框 2、时间选择框 3、下拉框 4、复选框 5、“阴魂不散”的select2 四、总结   正文 前言:之前介绍bootstrapTabl.
3054 0