Трубопровод для элемента не JSON-сериализуемый
Я пытаюсь записать вывод очищенного XML в JSON. Царапина не выполняется из-за невозможности сериализации.
Из этого вопроса рекомендуется, что вам нужно построить конвейер, ответ не предоставлен вне рамок для вопроса SO scrapy serializer
Обращаясь к документам Scrapy, это иллюстрирует пример, однако, затем, документы не советуют использовать это.
Цель JsonWriterPipeline - просто показать, как писать конвейеры элементов. Если вы действительно хотите сохранить все записанные элементы в файл JSON, вам следует использовать экспорт каналов.
Если я иду кормить экспорт, это показано
JSON
FEED_FORMAT: json Используемый экспортер: JsonItemExporter Смотрите это предупреждение, если вы используете JSON с большими фидами.
Моя проблема до сих пор остается, как я понимаю, для выполнения из командной строки как таковой.
scrapy runspider myxml.py -o ~/items.json -t json
Однако это создает ошибку, которую я намеревался использовать для решения проблемы с конвейером.
TypeError: <bound method SelectorList.extract of [<Selector xpath='.//@venue' data=u'Royal Randwick'>]> is not JSON serializable
Как создать конвейер json для исправления ошибки сериализации json?
Это мой код
# -*- coding: utf-8 -*-
import scrapy
from scrapy.selector import Selector
from scrapy.http import HtmlResponse
from scrapy.selector import XmlXPathSelector
from conv_xml.items import ConvXmlItem
# https://stackru.com/a/27391649/461887
import json
class MyxmlSpider(scrapy.Spider):
name = "myxml"
start_urls = (
["file:///home/sayth/Downloads/20160123RAND0.xml"]
)
def parse(self, response):
sel = Selector(response)
sites = sel.xpath('//meeting')
items = []
for site in sites:
item = ConvXmlItem()
item['venue'] = site.xpath('.//@venue').extract
item['name'] = site.xpath('.//race/@id').extract()
item['url'] = site.xpath('.//race/@number').extract()
item['description'] = site.xpath('.//race/@distance').extract()
items.append(item)
return items
# class JsonWriterPipeline(object):
#
# def __init__(self):
# self.file = open('items.jl', 'wb')
#
# def process_item(self, item, spider):
# line = json.dumps(dict(item)) + "\n"
# self.file.write(line)
# return item
1 ответ
Проблема здесь:
item['venue'] = site.xpath('.//@venue').extract
Вы просто забыли позвонить extract
, Заменить его на:
item['venue'] = site.xpath('.//@venue').extract()