2017-09-22 94 views
0

一个Scrapy项目我是新来scrapy和我正在寻找一种方式来序列化我的Scrapy项目,以便能够将属性添加到我的XML输出,因为它看起来是这样的:序列化XML输出

<field name='example'> i have some data scraped here </field> 

例如,我试图找到添加“名称”属性的方法。我知道这可能是通过重写XmlItemExporter类中的export_item()方法,但迄今为止我还没有运气。到目前为止,我XmlExportPipeline看起来是这样的:

from scrapy.exporters import XmlItemExporter 

class XmlExportPipeline(object): 

def open_spider(self, spider): 
    self.file = open('%s_products.xml' % spider.name, 'w+b') 
    self.exporter = XmlItemExporter(self.file, item_element='field', root_element='items') 
    self.exporter.start_exporting() 

def close_spider(self, spider): 
    self.exporter.finish_exporting() 
    self.file.close() 

def process_item(self, item, spider): 
    self.exporter.export_item(item) 
    return item 

而且,到目前为止,我所有的数据都是我的项目的不同领域,但最好我会有些这些字段等领域的属性。

回答

0

您只需更改XMLItemExporter并创建您自定义的一个。在项目中创建exporters.py并添加下面的代码,我没有被改变

self.xg.startElement(name, {}) 
.... 
self.xg.endElement(name) 

从原来的出口

self.xg.startElement("field", {"name" :name}) 
.... 
self.xg.endElement("field") 

然后更新您的settings.py并添加

import six 
from scrapy.exporters import XmlItemExporter 
from scrapy.utils.python import is_listlike 

class MyXmlExportPipeline(XmlItemExporter): 
    def _export_xml_field(self, name, serialized_value, depth): 
     self._beautify_indent(depth=depth) 
     self.xg.startElement("field", {"name": name}) 
     if hasattr(serialized_value, 'items'): 
      self._beautify_newline() 
      for subname, value in serialized_value.items(): 
       self._export_xml_field(subname, value, depth=depth+1) 
      self._beautify_indent(depth=depth) 
     elif is_listlike(serialized_value): 
      self._beautify_newline() 
      for value in serialized_value: 
       self._export_xml_field('value', value, depth=depth+1) 
      self._beautify_indent(depth=depth) 
     elif isinstance(serialized_value, six.text_type): 
      self._xg_characters(serialized_value) 
     else: 
      self._xg_characters(str(serialized_value)) 
     self.xg.endElement("field") 
     self._beautify_newline() 

只有两个变化

FEED_EXPORTERS = { 
    'xml': 'so.exporters.MyXmlExportPipeline' 
} 

然后,我创建了一个简单的刮刀来测试输出

class XMLExport(Spider): 
    name = "xml" 

    start_urls = ["http://www.tarunlalwani.com"] 

    def parse(self, response): 
     yield {"first_name": "tarun", "last_name": "lalwani"} 

    pass 

而且使用scrapy crawl xml -o test.xml和输出XML文件测试它是

<?xml version="1.0" encoding="utf-8"?> 
<items> 
<item><field name="first_name">tarun</field><field name="last_name">lalwani</field></item> 
</items>