Feedparser 未正确解析电子邮件正文
Feedparser not parsing email body properly
我正在尝试使用 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 testing1testing2testing3testing4testing5testing6\xa0 testing1testing2testing3testing4testing5testing6\xa0 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': 'testing1testing2testing3testing4testing5testing6\xa0 testing1testing2testing3testing4testing5testing6\xa0 testing1tes
ting2testing3testing4testing5testing6\xa0 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 提要之前进入 encode HTML entities or wrap the content in CDATA 部分。
要使用标准库对 HTML 个实体进行编码:
>>> from html import escape
>>> escape('<div dir="ltr">testing1<div>testing2')
'<div dir="ltr">testing1<div>testing2'
对于 CDATA:
>>> body='<div dir="ltr">testing1<div>testing2'
>>> print(f"<![CDATA[{body}]]>")
<![CDATA[<div dir="ltr">testing1<div>testing2]]>
这两个选项只影响标记,即使它看起来很可怕,它也会正确显示给最终用户。
我正在尝试使用 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 testing1testing2testing3testing4testing5testing6\xa0 testing1testing2testing3testing4testing5testing6\xa0 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': 'testing1testing2testing3testing4testing5testing6\xa0 testing1testing2testing3testing4testing5testing6\xa0 testing1tes
ting2testing3testing4testing5testing6\xa0 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 提要之前进入 encode HTML entities or wrap the content in CDATA 部分。
要使用标准库对 HTML 个实体进行编码:
>>> from html import escape
>>> escape('<div dir="ltr">testing1<div>testing2')
'<div dir="ltr">testing1<div>testing2'
对于 CDATA:
>>> body='<div dir="ltr">testing1<div>testing2'
>>> print(f"<![CDATA[{body}]]>")
<![CDATA[<div dir="ltr">testing1<div>testing2]]>
这两个选项只影响标记,即使它看起来很可怕,它也会正确显示给最终用户。