I am able to scrape data off a website but I need to export it in XML.
For this purpose I defined an serializer like so:
class Person(scrapy.Item):
Name = scrapy.Field(serializer=serialize_name)
Location = scrapy.Field()
And an XMLExportPipeline like so:
class XmlExportPipeline(object):
def __init__(self):
self.files = {}
@classmethod
def from_crawler(cls, crawler):
pipeline = cls()
crawler.signals.connect(pipeline.spider_opened, signals.spider_opened)
crawler.signals.connect(pipeline.spider_closed, signals.spider_closed)
return pipeline
def spider_opened(self, spider):
file = open('%s_people.xml' % spider.name, 'w+b')
self.files[spider] = file
self.exporter = XmlItemExporter(file, item_element='Person', root_element='People')
self.exporter.start_exporting()
def spider_closed(self, spider):
...
def process_item(self, person, spider):
self.exporter.export_item(person)
return person
This works and gives me an XML file like so:
<?xml version="1.0" encoding="utf-8"?>
<People><Person><Name>Bob</Name><Location>NYC</Location></Person></People>
How would I add attributes to tags? For instance, if I want
<Person Age="25" Likes="Programming">
how would I go about doing that?
Also quick follow-ups, why is the output XML not formatted like it is supposed to be? Can I convert the values in tags to CDATA (using a custom serializer to do that currently)?