Я посчитал количество, в основном выбрав все <option>
s, извлекая их атрибут value
и принимая их максимальное целочисленное значение.Вот так:
quantity_options = p.css('.product-add-container .box-quantity option::attr(value)').getall()
quantity = max(map(int, quantity_options))
Я также немного изменил код вашего кода
import scrapy
from scrapy.crawler import CrawlerProcess
class TrollandtoadSpider(scrapy.Spider):
name = 'TrollAndSpider'
start_urls = [
'https://www.trollandtoad.com/magic-the-gathering/magic-2020-m20-/14878'
]
logger = None
def parse(self, response: scrapy.http.Response):
for p in response.css('.product-col > .card > .row'):
p: scrapy.Selector
title = p.css('.prod-title a::text').get()
category = p.css('.prod-cat a::text').get()
stock = p.css("div.text-muted::text").get() or 'In Stock'
quantity_options = p.css('.product-add-container .box-quantity option::attr(value)').getall()
quantity = max(map(int, quantity_options))
buying_opts = p.css('.buying-options-table .row:last-child [class*=col-]')
seller = buying_opts[0].css('img::attr(title)').get()
if seller == 'PRE ORDER':
seller = 'TrollAndToad Com'
condition = buying_opts[1].css('::text').get()
price = buying_opts[3].css('::text').get()
product = {
'title': title,
'category': category,
'stock': stock,
'seller': seller,
'condition': condition,
'quantity': quantity,
'price': price,
}
yield product
if __name__ == '__main__':
p = CrawlerProcess()
p.crawl(TrollandtoadSpider)
p.start()
Вывод:
{
'title': 'Leyline of the Void 107/280',
'category': 'Magic 2020 (M20) Singles',
'stock': 'In Stock',
'seller': 'TrollAndToad Com',
'condition': 'Near Mint',
'quantity': 6,
'price': '$17.49'
},
{
'title': "Sephara, Sky's Blade 036/280",
'category': 'Magic 2020 (M20) Singles',
'stock': 'In Stock',
'seller': 'TrollAndToad Com',
'condition': 'Near Mint',
'quantity': 3,
'price': '$3.99'
}