#python #string #scrapy
#python #строка #scrapy
Вопрос:
Итак, я работаю над школьным проектом по извлечению некоторых данных с помощью Scrapy для извлечения данных в файл CSV. На веб-сайте данные имеют запятые, но я хочу удалить запятую из чисел, так как некоторые строки, которые я извлекаю, содержат три числа, а с запятыми все данные искажаются.
Вы можете видеть на изображении ниже желтым цветом, где запятая была удалена, но в розоватом выделении, где запятые все еще там.
Похоже, что при использовании функции replace она работает для некоторых строк, но не для других. Не могу понять, где я ошибся. Вот мой код:
# -*- coding: utf-8 -*-
import scrapy
class PsaSpider(scrapy.Spider):
name = 'psa'
allowed_domains = ['psacard.com']
start_urls = ['https://www.psacard.com/pop/t206/']
def parse(self, response):
rows = response.css('table.pop-grid tbody tr')
for row in rows:
yield {
'name' : row.css('td')[0].css('span.t206-pop-title::text').extract_first(default='').strip(),
'variety' : row.css('td')[0].css('span.variety::text').extract_first(default='').strip(),
'auth' : [x.strip().replace(',','') for x in row.xpath('td[3]//text()').extract()],
'psa1': [x.strip().replace(',','') for x in row.xpath('td[4]//text()').extract()],
'psa1.5': [x.strip().replace(',','') for x in row.xpath('td[5]//text()').extract()],
'psa2': [x.strip().replace(',','') for x in row.xpath('td[6]//text()').extract()],
'psa3': [x.strip().replace(',','') for x in row.xpath('td[7]//text()').extract()],
'psa4': [x.strip().replace(',','') for x in row.xpath('td[8]//text()').extract()],
'psa5': [x.strip().replace(',','') for x in row.xpath('td[9]//text()').extract()],
'psa6': [x.strip().replace(',','') for x in row.xpath('td[10]//text()').extract()],
'psa7': [x.strip().replace(',','') for x in row.xpath('td[11]//text()').extract()],
'psa8': [x.strip().replace(',','') for x in row.xpath('td[12]//text()').extract()],
'psa9': [x.strip().replace(',','') for x in row.xpath('td[13]//text()').extract()],
'psa10': [x.strip().replace(',','') for x in row.xpath('td[14]//text()').extract()],
}
Комментарии:
1. Вы на правильном пути или используете
replace()
, но вам также нужно заменить-
и не только запятые. Если вам нужна дополнительная помощь, пожалуйста, опубликуйте минимальный и функциональный пример кода 🙂
Ответ №1:
Вы уверены насчет запятых? Я думаю, у вас здесь проблема с тире. Попробуйте что-то вроде этого:
def parse(self, response):
def strip_second(sel, xpath):
return sum([int(x.strip().replace(',', '')) for x in sel.xpath(xpath).extract() if u'-' not in x])
def strip_first(sel, css):
return sel.css(css).get('').strip()
rows = response.css('table.pop-grid tbody tr')
for row in rows:
td = row.css('td')[0]
yield {
'name': strip_first(td, 'span.t206-pop-title::text'),
'variety': strip_first(td, 'span.variety::text'),
'auth': strip_second(row, 'td[3]//text()'),
'psa1': strip_second(row, 'td[4]//text()'),
'psa1.5': strip_second(row, 'td[5]//text()'),
'psa2': strip_second(row, 'td[6]//text()'),
'psa3': strip_second(row, 'td[7]//text()'),
'psa4': strip_second(row, 'td[8]//text()'),
'psa5': strip_second(row, 'td[9]//text()'),
'psa6': strip_second(row, 'td[10]//text()'),
'psa7': strip_second(row, 'td[11]//text()'),
'psa8': strip_second(row, 'td[12]//text()'),
'psa9': strip_second(row, 'td[13]//text()'),
'psa10': strip_second(row, 'td[14]//text()'),
}
Примером вывода будет:
{'psa1.5': [u'0', u'0'], 'auth': [u'2'], 'psa10': [u'0'], 'psa9': [u'0', u'0'], 'psa8': [u'0', u'0', u'0'], 'name': u'Wheat, Zack', 'variety': '', 'psa4': [u'0', u'0', u'0'], 'psa5': [u'0', u'1', u'0'], 'psa6': [u'0', u'0', u'0'], 'psa7': [u'0', u'0', u'0'], 'psa1': [u'0', u'0'], 'psa2': [u'0', u'0', u'0'], 'psa3': [u'0', u'0', u'0']}
Комментарии:
1. очень круто. Спасибо! у меня есть два вопроса по этому поводу. у меня все еще проблема с запятой. это в первой строке с итогами, поэтому это вызывает некоторые проблемы. куда бы я поместил это в этом коде? во-вторых, в конечном счете, я хотел бы просто суммировать эти три числа для каждой категории в каждой строке …. смогу ли я суммировать перед экспортом? Я планировал просто позаботиться об этом в Excel, но если можно сделать это в коде, было бы намного проще..
2. Хорошо, теперь я тебя понял. Теперь проверьте код в ответе, я обновил функцию
strip_second
.