2017-09-22 199 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>