XPATH получает все теги без тегов <script>и </script> - PullRequest
4 голосов
/ 20 апреля 2011

У меня возникли проблемы с получением всех HTML-тегов без <script> или <script ... /> с использованием Xpath.

Например, в этой части 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>

Я генерирую XML-файл с помощью Web-Harvest, а затем мне нужно удалить некоторые специфические теги. Я много пробовал xpath (я работаю в теле HTML):

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

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

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

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

но это не работает.

Обратите внимание, что //body//*[name() = 'script'] работает, но я хочу обратного ...

У вас есть идеи?

Или, более того, если вы знаете, как удалить все теги <script> <script/> с помощью Xpath, я также заинтересован в: -)

Заранее спасибо.

Ответы [ 2 ]

3 голосов
/ 21 апреля 2011

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>
3 голосов
/ 20 апреля 2011

Ну, прежде всего XPath выбирает узлы в существующем документе, но не удаляет их.И ваш путь //body//*, который вы начинаете, выбирает все дочерние и дочерние элементы элемента body.Даже если вы сейчас добавите предикат, такой как //body//*[not(self::script)], этот путь по-прежнему выбирает такие элементы, как li и center, которые сами не являются элементами script, но содержат элемент script.Таким образом, //body//*[not(self::script)] является правильным подходом, чтобы не выбирать какие-либо не script элементы, но это не поможет, если вы хотите, например, оригинальный элемент center с удаленным элементом script.Это не то, что чистый XPath может сделать для вас, вам нужно перейти на XSLT для преобразования документа и таким образом удалить все элементы script.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...