我有以下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内容的日期。
有人可以帮忙吗?
答案 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)以获取字符串值。