<div id="something">
<a id="dd_start">
<p>A</p
<h2>B</h2>
<p>C</p>
<h5>D</h5>
<script> </script>
<p>E</p>
<div></div>
</div>
如何在最后p
之前获取所有元素?我想要p
,h2
,p
和h5
:A B C D。
我试过了:
item['contents'] = ' '.join(response.xpath('//*[@id="something"]/preceding-sibling::*p//text()').extract()).strip()
item['contents'] = ' '.join(response.xpath('//*[@id="something"]/preceding-sibling::p[last()]//text()').extract()).strip()
item['contents'] = ' '.join(response.xpath('//*[@id="something"]/p[last()]/preceding-sibling::*//text()').extract()).strip()
似乎无法奏效。我的内容总是空着。
答案 0 :(得分:2)
对于此HTML,
<div id="something">
<p/>
<h2/>
<p/>
<h5/>
<script/>
<p/>
<div/>
</div>
要使用p
选择div
下id="something"
元素之前的所有同级元素,请使用此XPath:
//div[@id="something"]/p[last()]/preceding-sibling::*
返回
<p/>
<h2/>
<p/>
<h5/>
<script/>
按要求。
更新1 :对于此更新的HTML,
<div id="something">
<p/>A
<h2/>B
<p/>C
<h5/>D
<script/>
<p/>E
<div/>
</div>
这个XPath
//div[@id="something"]/p[last()]/preceding-sibling::text()
现在将选择
A
B
C
D
根据您的最新更新中的要求。
更新2 :如果你的HTML更像这样,
<div id="something">
<p>A</p>
<h2>B</h2>
<p>C</p>
<h5>D</h5>
<script/>
<p>E</p>
<div/>
</div>
这个XPath
//div[@id="something"]/p[last()]/preceding-sibling::*/text()
现在将选择前一个兄弟元素中的文本节点:
A
B
C
D
答案 1 :(得分:0)
//p[last()]/preceding-sibling::*
last()
指向最后一个<p>
。*
选择<p>
的所有先前的同级