2017-09-22 4 views
0

Ich bin neu in Scrapy und ich bin auf der Suche nach einer Möglichkeit, meine Scrapy Artikel, um die Serialisierung der Lage sein, Attribut zu meiner XML-Ausgabe hinzuzufügen, denn es ist auf diese Weise aussehen:serialisiert einen Scrapy Artikel für XML-Ausgabe

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

Ich versuche zum Beispiel eine Möglichkeit zu finden, das Attribut "name" hinzuzufügen. Ich weiß, dass es möglich sein kann, indem Sie die export_item() -Methode innerhalb der XmlItemExporter-Klasse überschreiben, aber bisher hatte ich kein Glück. Bisher meine XmlExportPipeline sieht wie folgt aus:

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 

auch bisher alle meine Daten ist ein anderes Feld meiner Artikel, sondern im Idealfall möchte ich einige dieser Felder als Attribute von anderen Bereichen haben.

Antwort

0

Sie müssen nur die XMLItemExporter ändern und Ihre benutzerdefinierte erstellen. Erstellen exporters.py in Ihrem Projekt und fügen Sie folgenden Code

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() 

die beiden einzigen Änderungen, die ich waren

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

Von der ursprünglichen Export nach

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

Dann Ihre settings.py änderte aktualisieren und fügen Sie

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

Dann hat ich einen einfachen Schaber den Ausgang

class XMLExport(Spider): 
    name = "xml" 

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

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

    pass 

und testen Sie es scrapy crawl xml -o test.xml und die Ausgabe XML-Datei war

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