首页 > 解决方案 > scrapy 能够检查是否只有下一个兄弟姐妹有预期的标签?

问题描述

让我发布我想先抓取的部分html

<div id="hello">
  <p>abc</p>
  <center><img src="image_url"></center>
  <p align="center" style="text-align: center;"><b>def</b></p>
  <center><img src="image_url"></center>
  <p align="center" style="text-align: center;"><b>def</b></p>
  <p>abc</p>
  <p align="center" style="text-align: center;"><b>def</b></p>
  <center><img src="image_url"></center>
  <p align="center" style="text-align: center;"><b>def</b></p>
  <p>abc</p>
  <center><img src="image_url"></center>
</div>

我正在尝试按image_url顺序抓取图像的 p 和 src 中的文本。问题是,我上面显示的 html 实际上不是静态的,所有页面都有不同的结构,这意味着有时会有更多p的标签,然后才有center标签,其中包括img src

由于pandcenter标记在每个页面中是随机构造的,因此我正在考虑获取所有p标记,例如使用response.css('#hello p')然后循环所有标记p以获取文本,但是在p循环时从当前标记获取文本时,还要检查下一个兄弟是否有center标记,如果这样做,则将其src附加。

我发现了类似的事情p.xpath('following-sibling::center[1]/img/@src').get(),因为 p 是迭代过程中的每个段落。

但我认为,这根本不起作用,因为假设我有 4 个p标签,直到 acenter我实际上会得到 4 个img src,因为这p.xpath('following-sibling::center[1]/img/@src').get()不仅会找到下一个兄弟姐妹,而且会遍历所有兄弟姐妹并查看center标签是否匹配。

我尝试使用谷歌搜索,但我没有看到任何提及仅检查下一个兄弟姐妹是否是某个标签的内容。任何人都知道我可以让它工作,以便我可以按顺序保存数据吗?

希望我的解释是有道理的。

提前感谢您的任何帮助和建议

标签: pythonhtmlweb-scrapingscrapynextsibling

解决方案


尝试以下 XPath 以获得所需的输出

p.xpath('following-sibling::*[1][name()="center"]/img/@src')

推荐阅读