извлечь данные из div, который не имеет класса, используя xpath - PullRequest
0 голосов
/ 09 сентября 2011

Код

    <div id="content">
        <div class="sample">sample text</div>
        <div class="datebar">
           <span style="float:right">some text1</span>
           <b>some text2</b>
        </div>
     <p>paragraph 1</p>
     <p>paragraph 2</p> 
   </div>

Я хочу получить данные в тегах <p>, или вы можете сказать, что они идут после <div class="datebar">.

Ответы [ 2 ]

3 голосов
/ 09 сентября 2011
//div[@id="content"]/p/text()

Достигнет желаемого с помощью предоставленного вами образца.


Обновление
Если вы хотите только те <p>, которые были добавлены после <div class="datebar">.Должно работать следующее:

//div[@id = 'content']/p[preceding-sibling::div[@class='datebar']]/text()

Еще одно обновление - для Кирилла

Вот пример HTML, который имеет дополнительный <p> перед <div class="datebar">и выражения xpath, протестированные с использованием python.

Очевидно, что решение зависит от того, что представляет собой полный входной HTML и что OP хочет извлечь, ни одно из которых на данный момент не ясно.

>>> from lxml import etree
>>> doc = etree.HTML("""
... <div id="content">
...   <div class="sample">sample text</div>
...   <p>paragraph 1</p>
...   <div class="datebar">
...     <span style="float:right">some text1</span>
...     <b>some text2</b>
...   </div>
...   <p>paragraph 2</p>
...   <p>paragraph 3</p>
... </div>""")
>>> # My first suggestion
... doc.xpath("//div[@id='content']/p/text()")
['paragraph 1', 'paragraph 2', 'paragraph 3']
>>> # Kirill's solution
... doc.xpath("//div[@id = 'content' and div[@class = 'datebar']]/p/text()")
['paragraph 1', 'paragraph 2', 'paragraph 3']
>>> # My response to Kirill
... doc.xpath("//div[@id = 'content']/p[preceding-sibling::div[@class='datebar']]/text()")
['paragraph 2', 'paragraph 3']

Выражение Кирилла //div[@id = 'content' and div[@class = 'datebar']]/p/text() не выбирает

только тех p, у которых родитель div имеет @id = 'content' и имеет предшествующие div с @class = 'datebar'

Как указано в его комментариях.

1 голос
/ 09 сентября 2011
//div[@id = 'content' and div[@class = 'datebar']]/p/text()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...