我使用feedparser http://www.feedparser.org/来解析Atom提要,并对生成的Python对象进行一些操作。之后,我想将对象序列化回Atom。但是feedparser似乎没有提供这样做的方法吗?
我注意到其他Atom库如gdata http://code.google.com/p/gdata-python-client/或demokritos http://jtauber.com/demokritos/但是,说实话,对于初学者来说它们似乎很难。我使用feedparser正是因为它非常简单。
对于namsral的良好反应,我用我最喜欢的模板语言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)
答案 0 :(得分:3)
使用像Mako,Jinja或Django这样的Python模板库,生成Feed非常简单。
使用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>
有关使用Django尤其是django-atompub的更多信息:http://code.google.com/p/django-atompub/wiki/UserGuide