2011-05-06 5 views
2

J'utilise feedparser http://www.feedparser.org/ pour analyser les flux Atom et effectuer des manipulations sur les objets Python résultants. Après cela, je voudrais sérialiser les objets à Atom. Mais feedparser ne semble pas offrir un moyen de le faire?Sérialisation d'un objet FeedParser sur Atom

J'ai remarqué d'autres bibliothèques Atom comme gdata http://code.google.com/p/gdata-python-client/ ou demokritos http://jtauber.com/demokritos/ mais, à vrai dire, elles semblent très difficiles pour le débutant. J'utilise feedparser précisément à cause de son extrême simplicité.

bonne réponse que vous avez choisi de namsral, j'ai écrit un sérialiseur avec ma langue modèle préféré, simpletal

import feedparser 

from simpletal import simpleTAL, simpleTALES, simpleTALUtils 

mytemplate = """ 
<feed xmlns="http://www.w3.org/2005/Atom"> 
    <title tal:condition="feed/title" tal:content="feed/title"/> 
    <link tal:condition="feed/link" tal:content="feed/link"/> 
    <updated tal:condition="feed/updated" tal:content="feed/updated"/> 
    <id tal:condition="feed/id" tal:content="feed/id"/> 
    <!-- TODO other feed variables --> 
    <entry xmlns='http://www.w3.org/2005/Atom' 
     xmlns:thr='http://purl.org/syndication/thread/1.0' 
     tal:repeat="entry entries"> 
    <title tal:condition="entry/title" tal:content="entry/title"/> 
    <summary tal:condition="entry/summary" tal:content="entry/summary"/> 
    <content tal:condition="entry/content" tal:content="python: entry.content[0]['value']"/> <!-- TODO: metadata and the other items in content --> 
    <id tal:condition="entry/id" tal:content="entry/id"/> 
    <published tal:condition="entry/published" tal:content="entry/published"/> 
    <updated tal:condition="entry/updated" tal:content="entry/updated"/> 
    <!-- TODO other entry fields --> 
    </entry> 
</feed> 
""" 
context = simpleTALES.Context(allowPythonPath=True) 
template = simpleTAL.compileXMLTemplate (mytemplate) 

class FeedParserPlus(feedparser.FeedParserDict): 

    def serialize(self): 
     context.addGlobal ("feed", self.feed) 
     context.addGlobal ("entries", self.entries) 
     result = simpleTALUtils.FastStringOutput() 
     template.expand (context, result) 
     return result.getvalue() 

    @classmethod 
    def parse(klass, text): 
     result = feedparser.parse(text) 
     return FeedParserPlus(result) 

Répondre

3

se nourrit de génération est assez facile en utilisant une bibliothèque de modèles Python comme Mako, Jinja ou Django.

Un exemple en utilisant Bottle.py:

<?xml version="1.0" encoding="utf-8"?> 
<feed xmlns="http://www.w3.org/2005/Atom"> 
    <title>{{! d['title'] }}</title> 
    <subtitle>{{! d['subtitle'] }}</subtitle> 
    <link rel="alternate" type="text/html" href="{{! d['site_url'] }}" /> 
    <link rel="self" type="application/atom+xml" href="{{! d['feed_url'] }}" /> 
    <id>{{! d['feed_url'] }}</id> 
    <updated>{{! d['date_updated'] }}</updated> 
    <rights>{{! d['copyright'] }}</rights> 

    %for entry in entries: 
    <entry> 
     <title>{{! entry['title'] }}</title> 
     <link rel="alternate" type="text/html" href="{{! entry['url'] }}" /> 
     <id>{{! entry['atom_id'] }}</id> 
     <published>{{! entry['date_published'] }}</published> 
     <updated>{{! entry['date_updated'] }}</updated> 
     <author> 
      <name>{{! d['author'] }}</name> 
      <uri>{{! d['site_url'] }}</uri> 
     </author> 
     <content type="html" xml:base="{{! d['site_url'] }}" xml:lang="en"> 
      <![CDATA[{{! entry['body'] }}]]> 
     </content> 
    </entry> 
    %end 

</feed> 

Pour plus d'informations sur l'utilisation de Django et surtout django-AtomPub: http://code.google.com/p/django-atompub/wiki/UserGuide

+0

OK, réponse adoptée. Merci. – bortzmeyer