5

我想创建一个 RSS Feed 生成器。生成器应该从我的数据库中读取数据并为它们生成 RSS 提要。我想编写一个脚本来自动生成xml文件进行验证。

因此,如果 RSS 提要的典型xml文件如下所示:

  <item>
  <title>Entry Title</title>
  <link>Link to the entry</link>
  <guid>http://example.com/item/123</guid>
  <pubDate>Sat, 9 Jan 2010 16:23:41 GMT</pubDate>
  <description>[CDATA[ This is the description. ]]</description>
  </item>

我希望脚本自动替换<item></item>标记之间的字段。同样适用于所有标签。标签的值将从数据库中获取。所以我会查询它。我的应用程序是用 Django 设计的。

我正在寻找有关如何在 python 中执行此操作的建议。如果我的想法含糊不清,我也愿意接受任何其他选择。

4

3 回答 3

10

因为这是python。使用它很好PyRSS2Gen。它易于使用并且非常好地生成 xml。https://pypi.python.org/pypi/PyRSS2Gen

于 2013-06-22T20:11:18.403 回答
3

你试过什么了?

一个非常基本的方法是使用Python DB API来查询数据库并执行一些简单的格式化使用str.format(我直接输入 SO——所以要小心拼写错误):

>>> RSS_HEADER = """
<whatever><you><need>
"""
>>> RSS_FOOTER = """
</need></you></whatever>
"""

>>> RSS_ITEM_TEMPLATE = """
<item>
    <title>{0}</title>
    <link>{1}</link>
</item>
"""


>>> print RSS_HEADER

>>> for row in c.execute('SELECT title, link FROM MyThings ORDER BY TheDate'):
        print RSS_ITEM_TEMPLATE.format(*row)

>>> print RSS_FOOTER
于 2013-06-21T08:09:35.293 回答
1

这个粗略的代码使用了一个非常有用的库,叫做BeautifulSoup。它用作 HTML/XML 标记语言的解析器,提供 python 对象模型。它可用于从 XML 中提取/更改信息或通过构建对象模型来创建 XML。

下面的代码通过从 pastebin 上的模板更改 XML 标记来工作。它通过复制模板“item”标签、清除其子标签并用可能来自数据库的合适字典条目来填充它们来做到这一点。

# Import System libraries
from copy import copy
from copy import deepcopy

# Import Custom libraries
from BeautifulSoup import BeautifulSoup, BeautifulStoneSoup, Tag, NavigableString, CData

def gen_xml(record):

    description_blank_str = \
    '''
    <item>
    <title>Entry Title</title>
    <link>Link to the entry</link>
    <guid>http://example.com/item/123</guid>
    <pubDate>Sat, 9 Jan 2010 16:23:41 GMT</pubDate>
    <description>[CDATA[ This is the description. ]]</description>
    </item>
    '''
    description_xml_tag = BeautifulStoneSoup(description_blank_str)

    key_pair_locations = \
    [
        ("title", lambda x: x.name == u"title"),
        ("link", lambda x: x.name == u"link"),
        ("guid", lambda x: x.name == u"guid"),
        ("pubDate", lambda x: x.name == u"pubdate"),
        ("description", lambda x: x.name == u"description")
    ]

    tmp_description_tag_handle = deepcopy(description_xml_tag)

    for (key, location) in key_pair_locations:
        search_list = tmp_description_tag_handle.findAll(location)
        if(not search_list):
            continue
        tag_handle = search_list[0]
        tag_handle.clear()
        if(key == "description"):
            tag_handle.insert(0, CData(record[key]))
        else:
            tag_handle.insert(0, record[key])

    return tmp_description_tag_handle

test_dict = \
{
    "title" : "TEST",
    "link" : "TEST",
    "guid" : "TEST",
    "pubDate" : "TEST",
    "description" : "TEST"
}
print gen_xml(test_dict)
于 2013-06-21T09:45:18.170 回答