//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'
Как указано в его комментариях.