Я пытаюсь написать вывод скребкового xml в json. Скребок выходит из строя из-за того, что элемент не является сериализуемым.Трубопровод для предмета не JSON serializable
От этого вопроса его советовали, что вам нужно построить трубопровод, ответ не предусмотрено выходит за рамки вопроса SO scrapy serializer
Так ссылаясь на Scrapy docs Это иллюстрирует пример, однако документы, то советую не использовать эту
Цель 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://stackoverflow.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
lol Ненавижу его, когда вы идете на гигантскую крупную погоню вниз по бессмысленной кроличьей дыре, спасибо – sayth