python - Feedparser 无法正确解析电子邮件正文
问题描述
我正在尝试使用 feedparser 通过将其作为原始文本提要输入来解析以下内容(来自 gmail 电子邮件正文)。我将在页面上显示它,因此我希望它看起来像在电子邮件正文中所做的那样,并且正在使用 feedparser 来帮助清理内容。
来自 GMail 的原始电子邮件正文,其中每个 testing#(例如 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 标记,则需要对 HTML 实体进行编码或将内容包装在CDATA部分中,然后再将其添加到 RSS 提要。
使用标准库对 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]]>
这两个选项只影响标记,即使它看起来很吓人,它也会正确显示给最终用户。
推荐阅读
- clang-tidy - 这个 clang-tidy 命令行有什么问题?
- wso2 - WSO2 API 管理器 2.6:apimcli 导出 api 错误
- javascript - 使用 chrome.system.cpu 计算当前 CPU 使用率
- mysql - 将子查询转换为 MySQL 的 JOIN 语句?
- azure-devops - 阻止项目管理员向 Azure DevOps 中的项目和组织添加新用户?
- javascript - 如何避免必须对具有 2 个条件的 javascript 数组进行两次排序
- javascript - 似乎无法访问反应导航中的参数
- sql - 计算闰年月份的天数
- java - java中如何强制子类实现其非抽象、非接口实现的父类的方法?
- python-3.x - 基于月份和日期的多个 pandas 数据帧的叠加图