2016-01-24 5 views
0

Я пытаюсь написать вывод скребкового 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 

ответ

1

Проблема здесь:

item['venue'] = site.xpath('.//@venue').extract 

Вы просто забыли позвонить extract. Замените его:

item['venue'] = site.xpath('.//@venue').extract() 
+0

lol Ненавижу его, когда вы идете на гигантскую крупную погоню вниз по бессмысленной кроличьей дыре, спасибо – sayth