Я думаю, что есть более эффективные способы, но следующий xpath
делает свою работу.string()
на xpath собирает текст со всех дочерних узлов.
Вы можете найти больше информации о различиях между string()
и text()
в этом сообщении Разница между text () и string ()
prices = [
r.xpath('string(.)').extract_first()
for r in response.xpath('//span[@class="price-state price-sale"]')
]
Как выможно увидеть по результатам, один продукт на строкуЕго можно очистить, например, с помощью replace
, или цены, извлеченные с использованием regex
>>> prices
['\n\nSale\n\n\n$5.99\n–\n\n$18.99\n', '\n\nSale\n\n\n$6...
Другой вариант - сделать это в два этапа, используя text()
вместо string()
и очистить данные.до операции join
:
>>> prices = []
>>> for r in response.xpath('//span[@class="price-state price-sale"]'):
>>> price = [p.strip() for p in r.xpath('.//text()').extract() if p.strip()]
>>> prices.append(' '.join(price))
Результаты в этом случае уже очищены
>>> prices
['Sale $ 5.99 – $ 18.99', 'Sale $ 6.99 – $ 18.99', 'Sale $ 6.99...