0

我有以下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 内容的日期。

有人可以帮忙吗?

4

1 回答 1

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()是代码异味)以获取字符串值。

于 2013-05-30T11:50:30.977 回答