Выберите div между html комментариями в lxml - PullRequest
3 голосов
/ 08 ноября 2011

Это мой HTML-файл

<div>
   <div></div>
   <div></div>
   <!--Comment1-->
   <div>1</div>
   <div>2</div>
   <div>3</div>
   <!--Comment2-->
   <div></div>
   <div></div>
   <div></div>
</div>

, и я хочу выбрать div между комментарием 1 и комментарием 2

С помощью этого xPath = "/ div / comment ()" я могу выбрать<!--Comment1--><!--Comment2-->

Но я хочу выбрать это

   <div>1</div>
   <div>2</div>
   <div>3</div>

Ответы [ 2 ]

7 голосов
/ 08 ноября 2011
//*[preceding-sibling::comment() and following-sibling::comment()]

или более строгая версия:

//*[preceding-sibling::comment()[. = 'Comment1'] 
    and following-sibling::comment()[. = 'Comment2']]
1 голос
/ 08 ноября 2011

В XPath 1.0 можно использовать общий (Kayessian) метод для пересечения двух множеств узлов $ns1 и $ns2:

$ns1[count(.|$ns2) = count($ns2)]

Когда мы заменим $ns1 и $ns2 их конкретными выражениями выбора для этого конкретного случая, мы получим:

/*/comment()[1]/following-sibling::div
            [count(. | /*/comment()[2]/preceding-sibling::div)
            =
             count(/*/comment()[2]/preceding-sibling::div)
            ]

Проверка на основе XSLT :

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

 <xsl:template match="/">
     <xsl:copy-of select=
     "/*/comment()[1]/following-sibling::div
            [count(. | /*/comment()[2]/preceding-sibling::div)
            =
             count(/*/comment()[2]/preceding-sibling::div)
            ]
     "/>
 </xsl:template>
</xsl:stylesheet>

когда это преобразование применяется к предоставленному документу XML :

<div>
   <div></div>
   <div></div>
   <!--Comment1-->
   <div>1</div>
   <div>2</div>
   <div>3</div>
   <!--Comment2-->
   <div></div>
   <div></div>
   <div></div>
</div>

Точные нужные узлы выбираются и выводятся :

<div>1</div>
<div>2</div>
<div>3</div>

В XPath 2.0 используется оператор intersect:

  /*/comment()[1]/following-sibling::div
intersect
 /*/comment()[2]/preceding-sibling::div
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...