Я был человеком, который написал пост в блоге, который вы перечислили. Я скопировал код из сущности и просто запустил его под Kubuntu 11.10, после установки PyRSSGen2, и без проблем создал код. Посмотрите в файле test.xml, он должен выглядеть так:
<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:media="http://search.yahoo.com/mrss/">
<channel>
<title>Example Title</title>
<link>http://example.com</link>
<description>Example RSS Output</description>
<pubDate>Thu, 27 Oct 2011 05:36:27 GMT</pubDate>
<lastBuildDate>Thu, 27 Oct 2011 05:36:27 GMT</lastBuildDate>
<generator>PyRSS2Gen-1.0.0</generator>
<docs>http://blogs.law.harvard.edu/tech/rss</docs>
<item>
<title>Item Title</title>
<link>http://example.com</link>
<media:thumbnail url="http://example.com/image.jpg"></media:thumbnail>
<description>< ![CDATA[<p><b>example</b>text<p><br/>
<p>Where are you going today?</p>
]]></description>
<guid>random_guid_x9129319</guid>
<pubDate>Thu, 27 Oct 2011 14:36:27 GMT</pubDate>
</item>
</channel>
</rss>
Ниже я попытаюсь объяснить, как работает этот код, ради потомков.
Как и в случае с ViennaMike, PyRSS2Gen использует встроенную библиотеку SAX, которая автоматически экранирует HTML. Однако есть способы обойти это. Во фрагменте кода, который вы упомянули, я переопределил «RSSItem» PyRSS2Gen, чтобы при выводе «description» он ничего не выводил. (Это было то, что стояло за включением класса "NoOutput").
Поскольку описание не выводится, мы должны добавить метод, чтобы присоединить его к выводу самостоятельно. Следовательно, код "publish_extensions" (который выводит теги media_thumbnail и description).
Я вижу, что это несколько сбивает с толку (поскольку вам не нужен класс media_thumbnail), поэтому я решил переписать этот класс, чтобы не было класса "Media Thumbnail", который бы все испортил.
# This is insecure, and only here for a proof of concept. Your mileage may vary. Et cetra.
import PyRSS2Gen
import datetime
class NoOutput:
def __init__(self):
pass
def publish(self, handler):
pass
class IPhoneRSS2(PyRSS2Gen.RSSItem):
def __init__(self, **kwargs):
PyRSS2Gen.RSSItem.__init__(self, **kwargs)
def publish(self, handler):
self.do_not_autooutput_description = self.description
self.description = NoOutput() # This disables the Py2GenRSS "Automatic" output of the description, which would be escaped.
PyRSS2Gen.RSSItem.publish(self, handler)
def publish_extensions(self, handler):
handler._out.write('<%s>< ![CDATA[%s]]></%s>' % ("description", self.do_not_autooutput_description, "description"))
# How to use:
rss = PyRSS2Gen.RSS2(
title = "Example Title",
link="http://example.com",
description="Example RSS Output",
lastBuildDate=datetime.datetime.utcnow(),
pubDate=datetime.datetime.utcnow(),
items=[
IPhoneRSS2(
title="Item Title",
description="""<p><b>example</b>text<p><br/>
<p>Where are you going today?</p>
""",
link="http://example.com",
guid="random_guid_x9129319",
pubDate=datetime.datetime.now()),
]
)
rss.rss_attrs["xmlns:media"] = "http://search.yahoo.com/mrss/"
rss.write_xml(open("test.xml", "w"), "utf-8")
Вы упоминаете, что хотите включить изображение в свой канал; Вы включаете HTML-код изображения в тег описания или в другом месте? Если это где-то еще, можете ли вы предоставить образец RSS-канала, чтобы я мог внести соответствующие изменения в вашу ситуацию?