Scrapy возвращает строки в юникоде, а не в ascii. Чтобы закодировать все строки в utf-8, вы можете написать:
vriskoit['eponimia'] = [s.encode('utf-8') for s in hxs.select('//a[@itemprop="name"]/text()').extract()]
Но я думаю, что вы ожидаете другого результата. Ваш код возвращает один элемент со всеми результатами поиска. Чтобы вернуть элементы для каждого результата:
hxs = HtmlXPathSelector(response)
for eponimia, address in zip(hxs.select("//a[@itemprop='name']/text()").extract(),
hxs.select("//div[@class='results_address_class']/text()").extract()):
vriskoit = VriskoItem()
vriskoit['eponimia'] = eponimia.encode('utf-8')
vriskoit['address'] = address.encode('utf-8')
yield vriskoit
Обновление
JSON exporter записывает символы Unicode, экранированные (например, \u03a4
) по умолчанию, потому что не все потоки могут обрабатывать Unicode. Он имеет возможность записать их как Unicode ensure_ascii=False
(см. Документы для json.dumps ). Но я не могу найти способ передать эту опцию стандартному экспортеру фидов.
Таким образом, если вы хотите, чтобы экспортируемые элементы были записаны в кодировке utf-8
, например, для чтения их в текстовом редакторе вы можете написать собственный конвейер элементов.
pipelines.py:
import json
import codecs
class JsonWithEncodingPipeline(object):
def __init__(self):
self.file = codecs.open('scraped_data_utf8.json', 'w', encoding='utf-8')
def process_item(self, item, spider):
line = json.dumps(dict(item), ensure_ascii=False) + "\n"
self.file.write(line)
return item
def spider_closed(self, spider):
self.file.close()
Не забудьте добавить этот конвейер в settings.py:
ITEM_PIPELINES = ['vrisko.pipelines.JsonWithEncodingPipeline']
Вы можете настроить конвейер для записи данных в более удобочитаемом формате, например, Вы можете создать некоторый форматированный отчет. JsonWithEncodingPipeline
это просто базовый пример.