我在我的RSS Feed上测试feedparser
。
它就像一个魅力,我得到了所有条目。
有些新闻有嵌入式youtube播放器,但这不会出现在feedparser的返回值中。
我的代码很简单:
d = feedparser.parse('http://feeds.feedburner.com/NotciasPs3evita-Mypst')
返回(摘录):
guidislink': False,
'id': u'http://mypst.com.br/forum/index.php?/topic/17336-gamegen-call-of-duty-black-ops-2-ganha-trailer-com-acao-real-e-muitas-surpresas/',
'link': u'http://mypst.com.br/forum/index.php?/topic/17336-gamegen-call-of-duty-black-ops-2-ganha-trailer-com-acao-real-e-muitas-surpresas/',
'links': [{'href': u'http://mypst.com.br/forum/index.php?/topic/17336-gamegen-call-of-duty-black-ops-2-ganha-trailer-com-acao-real-e-muitas-surpresas/',
'rel': u'alternate',
'type': u'text/html'}],
'published': u'Mon, 29 Oct 2012 14:53:58 +0000',
'published_parsed': time.struct_time(tm_year=2012, tm_mon=10, tm_mday=29, tm_hour=14, tm_min=53, tm_sec=58, tm_wday=0, tm_yday=303, tm_isdst=0),
'summary': u'A Activision revelou hoje um novo trailer de Call of Duty: Black Ops 2, substituindo as cenas de a\xe7\xe3o do jogo por cenas de a\xe7\xe3o na vida real. O trailer traz diversas \u201csurpresas\u201d e alguns zumbis.<br />\n<br />\n<br />\n<br />\nCall of Duty: Black Ops 2 chegar\xe1 no dia 13 de novembro nos Estados Unidos.<br />\n<br />\n<br />\n<em class="bbc"><strong class="bbc">Fonte: <a class="bbc_url" href="http://www.gamegen.com.br/playstation3/call-of-duty-black-ops-2-ganha-trailer-com-acao-real-e-muitas-surpresas/" rel="nofollow external" title="Link externo">GameGeneration</a></strong></em>',
'summary_detail': {'base': u'http://feeds.feedburner.com/NotciasPs3evita-Mypst',
'language': None,
'type': u'text/html',
'value': u'A Activision revelou hoje um novo trailer de Call of Duty: Black Ops 2, substituindo as cenas de a\xe7\xe3o do jogo por cenas de a\xe7\xe3o na vida real. O trailer traz diversas \u201csurpresas\u201d e alguns zumbis.<br />\n<br />\n<br />\n<br />\nCall of Duty: Black Ops 2 chegar\xe1 no dia 13 de novembro nos Estados Unidos.<br />\n<br />\n<br />\n<em class="bbc"><strong class="bbc">Fonte: <a class="bbc_url" href="http://www.gamegen.com.br/playstation3/call-of-duty-black-ops-2-ganha-trailer-com-acao-real-e-muitas-surpresas/" rel="nofollow external" title="Link externo">GameGeneration</a></strong></em>'},
'title': u'[GameGen] Call of Duty: Black Ops 2 ganha trailer com a\xe7\xe3o real e muitas surpresas',
'title_detail': {'base': u'http://feeds.feedburner.com/NotciasPs3evita-Mypst',
'language': None,
'type': u'text/plain',
'value': u'[GameGen] Call of Duty: Black Ops 2 ganha trailer com a\xe7\xe3o real e muitas surpresas'}},
除了youtube播放器<object>
标记外,一切都已到位。这是一个feedparser bug还是我的rss上的问题?在python上有其他lib来做这个吗?
答案 0 :(得分:4)
默认情况下会删除Feedparser sanitizes HTML input和<object>
,<param>
和<embed>
标记。
您需要停用清理功能(仅当您真正信任来源时)或将YouTube代码列入白名单。
要禁用清理,请将SANITIZE_HTML
设置为False:
feedparser.SANITIZE_HTML = False
要添加到白名单,请将元素添加到_HTMLSanitizer.acceptable_elements
集:
_HTMLSanitizer.acceptable_elements.update(['object', 'param', 'embed'])
这两种方法都有固有的风险,你可以通过这种方式开展攻击。我使用的方法是完全切换清理,然后使用some other method清理HTML,可能使用lxml.html.clean
白名单并在host_whitelist
列出YouTube。
答案 1 :(得分:1)
在回应上述解决方案时,看起来最近SANITIZE_HTML设置已在feedparser.api下移动:
feedparser.api.SANITIZE_HTML = False
feedparser.api.mixin.SANITIZE_HTML = False