XPATH获取没有<script>和</script>标记的所有标记

时间:2011-04-20 09:23:31

标签: html xpath tags

我在使用Xpath时没有<script><script ... />获取所有html标签时遇到了一些问题。

例如,在HTML代码的这一部分中,我想删除:

<script type="text/javascript" src="http://www.google.com/coop/cse/brand?form=cse-search-box&amp;lang=fr"/>

代码

<li><!-- Search Google -->
<center>
                     <form action="http://www.google.fr/cse" id="cse-search-box" target="_blank">
                        <div>
                           <input type="hidden" name="cx" value="partner-pub-0959382714089534:mw3ssl65jk1"/>
                           <input type="hidden" name="ie" value="ISO-8859-1"/>
                           <input type="text" name="q" size="31"/>
                           <input type="submit" name="sa" value="Rechercher"/>
                        </div>
                     </form>
                     <script type="text/javascript"
                             src="http://www.google.com/coop/cse/brand?form=cse-search-box&amp;lang=fr"/>
                  </center>
                  <!-- Search Google --></li>

我正在使用Web-Harvest生成一个xml文件,然后我必须删除一些特定标签。 我尝试了很多xpath(我正在使用html的主体):

  • //body//*[not(name() = 'script')]

  • //body//*[not(self::script)]

  • //body//*[not(starts-with(name(),'script'))]

  • //body//*[not(contains(name(),'script'))]

但它不起作用。

请注意//body//*[name() = 'script']正在运作,但我希望相反......

你有什么想法吗?

或者更常见的是,如果您知道如何使用Xpath删除所有<script> <script/>标记,我也会感兴趣: - )

提前致谢。

2 个答案:

答案 0 :(得分:3)

首先,XPath选择现有文档中的节点,但不会删除它们。您开始的路径//body//*选择body元素的所有子元素和后代元素。即使您现在添加类似//body//*[not(self::script)]的谓词,该路径仍会选择licenter元素之类的元素,这些元素本身不是script元素,但包含{{1}元素。因此,script是不选择任何非//body//*[not(self::script)]元素的正确方法,但如果您想要移除script元素的原始center元素,则无效。这不是纯XPath可以为您做的事情,您需要转移到XSLT来转换文档,这样就可以删除任何script元素。

答案 1 :(得分:3)

XPath只是XML文档的查询语言,因此它无法以任何方式改变正在查询的XML文档

生成与初始XML文档不同的新XML文档的最方便方法是使用XSLT。

这个简短而简单的XSLT转换

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="node()|@*">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>

 <xsl:template match="script"/>
</xsl:stylesheet>

应用于提供的XML文档时:

<li>
    <!-- Search Google -->
    <center>
        <form action="http://www.google.fr/cse"
              id="cse-search-box" target="_blank">
            <div>
                <input type="hidden" name="cx"
                value="partner-pub-0959382714089534:mw3ssl65jk1"/>
                <input type="hidden" name="ie" value="ISO-8859-1"/>
                <input type="text" name="q" size="31"/>
                <input type="submit" name="sa" value="Rechercher"/>
            </div>
        </form>
        <script type="text/javascript"
        src="http://www.google.com/coop/cse/brand?form=cse-search-box&amp;lang=fr"/>
    </center>
    <!-- Search Google -->
</li>

生成想要的正确结果

<li><!-- Search Google -->
   <center>
      <form action="http://www.google.fr/cse" id="cse-search-box" target="_blank">
         <div>
            <input type="hidden" name="cx" value="partner-pub-0959382714089534:mw3ssl65jk1"/>
            <input type="hidden" name="ie" value="ISO-8859-1"/>
            <input type="text" name="q" size="31"/>
            <input type="submit" name="sa" value="Rechercher"/>
         </div>
      </form>
   </center><!-- Search Google -->
</li>