如何在Scrapy中通过data-number定位并提取对应价格文本?
提取同级label内价格文本的解决方案
问题背景
需要从custom-control/label/font标签内提取价格文本,唯一区分标识是data-number属性(末尾字母为不同控件区块的唯一区分元素)。已获取页面中所有data-number列表:
['025.00286GA', '025.00286GV', '025.00286NWA', '025.00286NW', '025.00286NWV', '025.00286R']
目前可通过以下XPath定位到对应input元素:
//input[contains(@data-number, "' + box_contents[0] + '")]
但input无后代div,需获取其同级label标签内的嵌套价格文本(如€676.05),以下是具体实现方法及优化方案:
一、XPath遍历实现方法
1. 用following-sibling定位后续同级label
如果label在input的同级且位置靠后,直接通过兄弟轴定位:
//input[contains(@data-number, "' + box_contents[0] + '")]/following-sibling::label[1]/font/text()
following-sibling::label[1]:选取当前input之后的第一个同级label元素- 末尾追加
/font/text()直接提取目标价格文本
2. 先找父容器再定位子label
如果input和label同属一个父节点(比如都在custom-control容器内),可先回退到父节点再查找label:
//input[contains(@data-number, "' + box_contents[0] + '")]/../label/font/text()
/../:回到input的父节点- 再通过
/label/font/text()定位到嵌套的价格文本
二、更优方案:直接定位目标label
既然data-number是唯一标识,可跳过input直接关联定位label,减少遍历层级:
//label[../input[contains(@data-number, "' + box_contents[0] + '")]]/font/text()
如果label本身或其直接父节点带有可关联的标识,还能进一步简化XPath,提升定位效率。
另外,在代码循环处理data-number列表时,建议用格式化字符串提升可读性(以Python为例):
for num in box_contents: price_xpath = f'//input[contains(@data-number, "{num}")]/following-sibling::label[1]/font/text()' price = response.xpath(price_xpath).get()
内容的提问来源于stack exchange,提问作者cforcomputer
相关产品推荐
相关产品推荐

