Трубопровод для элемента не 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()
Другие вопросы по тегам