如何通过 XPath 选择最后一个 p 元素之前的所有元素?
Posted
技术标签:
【中文标题】如何通过 XPath 选择最后一个 p 元素之前的所有元素?【英文标题】:How to select all the elements before last p element via XPath? 【发布时间】:2016-09-11 12:54:30 【问题描述】:<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()
似乎无法正常工作。我的内容总是返回空。
【问题讨论】:
您是否打算将您添加的文本设置为 within 或 between @ 987654330@、h2
等元素?您现在正在在之间显示它。
嗯,我想要最后一个 之前的所有文本 .. 我客户的网站有时会与 h2 或 h3 之类的其他内容混合在一起 .. 我实际上想把内容刮掉 ..
我可以go on and on with updates,猜猜你想要什么,或者你可以为自己和你的读者节省大量时间并创建一个minimal reproducible example 你真的应该已经完成了。 【参考方案1】:对于这个 html,
<div id="something">
<p/>
<h2/>
<p/>
<h5/>
<script/>
<p/>
<div/>
</div>
要使用id="something"
选择div
下最后一个p
元素之前的所有同级元素,请使用此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
【讨论】:
不需要添加/text()?但我试过没有 text() 只是现在仍然不能:( 您说您想要p
、h2
、p
和h5
,而您的示例没有显示任何文本。是的,您可以获取文本,但您必须更具体:编辑您的问题,将文本添加到您的示例中,并说明哪些文本应该返回,哪些文本不应该返回。
yaya 但它仍然返回空:(
您的 HTML 示例格式不正确,它必须是这样才能使用 XPath。我已经为你关闭了标签,所以它的格式很好。给定格式良好的 XML,我展示的 XPath 会返回请求的元素。【参考方案2】:
//p[last()]/preceding-sibling::*
使用last()
指向最后一个<p>
。
然后使用*
选择<p>
的所有前面的兄弟姐妹
【讨论】:
以上是关于如何通过 XPath 选择最后一个 p 元素之前的所有元素?的主要内容,如果未能解决你的问题,请参考以下文章