zoukankan      html  css  js  c++  java
  • 2012-09-10 23:30 如何解决HtmlAgilityPack得到的InnerText中有残留的script、样式的问题

    那么如何解决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 

  • 相关阅读:
    闲来无事研究研究.Net中的异步编程
    Sql Server 因为触发器问题导致数据库更新报错“在触发器执行过程中引发了错误,批处理已中止”的问题处理
    c# 连接Redis报错:WRONGTYPE Operation against a key holding the wrong kind of value:类型搞混弄出的错误
    VS2013 调试时出现“表达式计算器中发生内部错误”的问题解决办法
    WCF优化的几个常规思路
    UWP汉堡菜单
    C#注册系统全局快捷键
    CXF详细介绍
    hadoop默认3个核心配置文件说明
    在虚拟机配置hive
  • 原文地址:https://www.cnblogs.com/cappuccino/p/3403495.html
Copyright © 2011-2022 走看看