2017-09-22 4 views
0

에 대한 Scrapy 항목을 직렬화와 나는 이런 식으로보고를 위해, 내 XML 출력에 속성을 추가 할 수 있도록하기 위해 내 Scrapy 항목을 직렬화하는 방법을 찾고 있어요 :내가 scrapy에 새로운 오전 XML 출력

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

예를 들어, "name"속성을 추가하는 방법을 찾으려고합니다. XmlItemExporter 클래스 내에서 export_item() 메서드를 재정 의하여 가능할 수 있다는 것을 알고 있지만 지금까지 행운이 없었습니다.

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 

는 또한, 지금까지 내 모든 데이터가 내 항목의 다른 필드이지만, 이상적으로 나는 다른 분야의 속성과 해당 필드의 일부를했을 : 지금까지 내 XmlExportPipeline은 다음과 같습니다.

답변

0

XMLItemExporter을 변경하고 맞춤 설정을 만들어야합니다. I이었다 그런 다음 settings.py를 업데이트

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

에 원래의 수출에서

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

을 변경하고

를 추가 않았다

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

유일한 두 가지 변경 사항을 프로젝트에 exporters.py를 만들고 코드를 아래에 추가

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> 
했다