Получаете ли вы правильные данные при тестировании в оболочке Scrapy? Стоит опробовать ваши селекторы в оболочке scrapy, прежде чем передавать их в скрипт.
Я не рассматривал подробно ваши селекторы CSS, но есть много циклов for, по сути, все, что вам нужно сделать, это л oop по тр. Поэтому поиск селектора CSS, который возвращает вам все строки вместо того, чтобы перебирать всю таблицу в цикле и работать дальше, вероятно, более эффективен.
Обновление:
Поскольку вы спросили о for l oop
for p in response.css('tbody#lnkPart > tr'):
yield {
'Part': p.css('td.tr-mfgPartNumber span::text').get(),
'Quantity': p.css('td.tr-minQty.ptable-param span.desktop::text').get(),
'Price': p.css('td.tr-unitPrice.ptable-param span::text').get()
}
Обратите внимание, что нам нужно только l oop вокруг tr, чтобы выбрать все из них. Метод get () выбирает только элемент с указанным c tr.
Обратите внимание, что вам нужно подумать о том, как вы будете обрабатывать пространство и ни одного элемента. Стоит хорошенько подумать над этой частью и придумать простой способ изменить результаты.
Обновленный код
def parse(self, response):
for p in response.css('tbody#lnkPart > tr'):
if p.css('td.tr-minQty.ptable-param span.desktop::text').get():
quantity = p.css('td.tr-minQty.ptable-param span.desktop::text').get()
quantity = quantity.strip()
cleaned_quantity = int(quantity.replace(',',''))
else:
quantity = 'No quantity'
if p.css('td.tr-unitPrice.ptable-param span::text').get():
price = p.css('td.tr-unitPrice.ptable-param span::text').get()
cleaned_price = price.strip()
else:
price = 'No Price'
yield {
'Part': p.css('td.tr-mfgPartNumber span::text').get(),
'Quantity': cleaned_quantity,
'Price': cleaned_price
}