Feedparser未正确解析电子邮件正文



我正试图通过将以下内容作为原始文本提要输入,使用feedparser解析以下内容(来自gmail电子邮件正文(。我将把它显示在一个页面上,所以我希望它看起来像在电子邮件正文中一样,并使用feedparser来帮助清理内容。

来自GMail的原始电子邮件正文,其中每个测试#(例如testing1、testing2等(都在一个新行上:

<div dir="ltr">testing1<div>testing2</div><div>testing3</div><div>testing4</div><div>testing5</div><div>testing6</div><div>  testing1<div>testing2</div><div>testing3</div><div>testing4</div><div>testing5</div><d
iv>testing6</div><div>  testing1<div>testing2</div><div>testing3</div><div>testing4</div><div>testing5</div><div>testing6</div></div><div>  testing1<div>testing2</div><div>testing3</div><div>testing4</div><div>t
esting5</div><div>testing6</div></div><div><br></div>-- <br><div dir="ltr" class="gmail_signature" data-smartmail="gmail_signature"><div dir="ltr">Bob Johnson<br>(123) 456-7890</div></div></div></div>

然后我把它输入到RSS提要中,如下所示:

<rss version="2.0">
<channel>
<title>Created Feed</title>
<item><title>test2</title>
<pubDate>Sun, 23 May 2021 21:38:03 -0400</pubDate>
<link>elysiumreader+yac41zdxipljzcfl@gmail.comSun23May20212138030400</link>
<content><div dir="ltr">testing1<div>testing2</div><div>testing3</div><div>testing4</div><div>testing5</div><div>testing6</div><div>  testing1<div>testing2</div><div>testing3</div><div>testing4</div><div>testing5</div><d
iv>testing6</div><div>  testing1<div>testing2</div><div>testing3</div><div>testing4</div><div>testing5</div><div>testing6</div></div><div>  testing1<div>testing2</div><div>testing3</div><div>testing4</div><div>t
esting5</div><div>testing6</div></div><div><br></div>-- <br><div dir="ltr" class="gmail_signature" data-smartmail="gmail_signature"><div dir="ltr">Bob Johnson<br>(123) 456-7890</div></div></div></div>
</content>
</channel>
</rss>

它最终会像下面这样被解析,在那里它丢失了行之间的换行符,最终看起来像是
标记将其丢弃,并停止了正确的解析。

{'title': 'test2', 'title_detail': {'type': 'text/plain', 'language': None, 'base': '', 'value': 'test2'}, 'published': 'Sun, 23 May 2021 21:38:03 -0400', 'published_parsed': time.struct_time(tm_year=2021, tm_mo
n=5, tm_mday=24, tm_hour=1, tm_min=38, tm_sec=3, tm_wday=0, tm_yday=144, tm_isdst=0), 'links': [{'rel': 'alternate', 'type': 'text/html', 'href': 'www.test.com/blablabla'}
], 'link': 'www.test.com/blablabla', 'content': [{'type': 'application/xhtml+xml', 'language': None, 'base': '', 'value': 'testing1testing2testing3testing4testing5testing6
xa0 testing1testing2testing3testing4testing5testing6xa0 testing1testing2testing3testing4testing5testing6xa0 testing1testing2testing3testing4testing5testing6<br /></div>-- <br /><div class="gmail_signature" di
r="ltr"><div dir="ltr">Bob Johnson<br />(123) 456-7890</div></div></div></div>'}], 'summary': 'testing1testing2testing3testing4testing5testing6xa0 testing1testing2testing3testing4testing5testing6xa0 testing1tes
ting2testing3testing4testing5testing6xa0 testing1testing2testing3testing4testing5testing6<br /></div>-- <br /><div class="gmail_signature" dir="ltr"><div dir="ltr">Bob Johnson<br />(123) 456-7890</div></div></div></div>'}

任何想法或想法都将不胜感激。感谢

RSS基本上是一个XML文档,因此它必须遵循相当严格的规则。你从Gmail中提取的HTML标记破坏了RSS文档。如果您希望提要包含HTML标记,则在将其添加到RSS提要之前,需要对HTML实体进行编码或将内容包装在CDATA部分中。

使用标准库对HTML实体进行编码:

>>> from html import escape
>>> escape('<div dir="ltr">testing1<div>testing2')
'&lt;div dir=&quot;ltr&quot;&gt;testing1&lt;div&gt;testing2'

对于CDATA:

>>> body='<div dir="ltr">testing1<div>testing2'
>>> print(f"<![CDATA[{body}]]>")
<![CDATA[<div dir="ltr">testing1<div>testing2]]>

这两个选项都只影响标记,即使它看起来很可怕,它也会正确地显示给最终用户。

最新更新