前一个兄弟的xpath

时间:2013-05-30 11:19:11

标签: python xpath lxml

我有以下html:

<div id="content-home">
  <p>some date 1</p>
  <div class="content"><p>bla1.1</p></div>
  <div class="content"><p>bla1.2</p></div>
  <p>some date 2</p>
  <div class="content"><p>bla2.1</p></div>
  <div class="content"><p>bla2.2</p></div>
  <div class="content"><p>bla2.3</p></div>
  <p>some date 3</p>
  <div class="content"><p>bla3.1</p></div>
  <div class="content"><p>bla3.2</p></div>
  <div class="content"><p>bla3.3</p></div>
  <div class="content"><p>bla3.4</p></div>
</div>

使用xpath我想找回每个div类内容的日期。有了这个:

tree.xpath("///div[@id='content-home']/p[following-sibling::div[@class='content']]/text()")

以及

tree.xpath("///div[@id='content-home']/p[preceding-sibling::div[@class='content']]/text()")

我只得到一个包含3个条目的列表。我想找回9个条目(2x date1,3x date3和4x date4。我尝试了很多东西,但保留了3个条目(date1,date2,date3)。我怎么能意识到这一点。 我真正想要做的是注册每个div内容的日期。

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:4)

我没有立即看到一个XPath表达式可以做到这一点,但是一些中间Python使它变得容易:

>>> divs = x.xpath("//div[@class='content'][preceding-sibling::p]")
>>> [d.xpath("string((preceding-sibling::p)[last()])")
...  for d in divs]
['some date 1', 'some date 1', 'some date 2', 'some date 2', 'some date 2', 'some date 3', 'some date 3', 'some date 3', 'some date 3']

第二个XPath表达式可以从里面读出来:

preceding-sibling::p

表示正在考虑的div的前一个兄弟,其标记为p。其中,

(preceding-sibling::p)[last()]

是最后一个。您需要括号,因为[]的绑定比::更强。

然后将其包含在string()调用中(因为text() is a code smell)以获取字符串值。