我从另一个开发人员继承了一个函数,该函数应该检查电子邮件消息的body参数是HTML主体还是纯文本。如果它是HTML,它会将正文和html版本的主体附加到消息中,如果正文不是html,则它只附加一个简单的正文。
def insertBody(self, body):
if bool(BeautifulSoup(body, "html.parser").find()):
b = MIMEMultipart('alternative')
b.attach( MIMEText(html2text.html2text(body),'plain') )
b.attach( MIMEText(body,'html') )
else:
b = MIMEText(body,'text')
self._msg.attach(b)
return
问题在于它似乎没有检测到什么时候只传递一个普通的身体,只有当我提交一个带有<html>
和<body>
标签的身体时它才有效。我在想它可能是find()
函数的使用,但我对Beautifulsoup的熟悉程度不够。我是在正确的轨道上吗?
答案 0 :(得分:1)
该测试有三个问题:
您不需要在bool()
测试中使用if
,因为if
语句已完全相同。
测试太简单了。只要文本中包含<
字符,然后是文本,然后后面的由>
字符,测试就会通过:
>>> from bs4 import BeautifulSoup
>>> BeautifulSoup('<foo bar\n baz> spam ham', 'html.parser').find()
<foo bar="" baz=""> spam ham</foo>
使用BeautifulSoup
进行完整解析是一种过度杀伤,可以通过以下方式更有效地执行相同的测试:
import re
if re.search('<[^>]+>', body):
# ...
可以调整正则表达式以查找实际有效的HTML标记,例如:
html = re.compile('<(?:html|head|body)[^>]*>', flags=re.I)
if html.search(body):
以上检测到开放<html>
,<head>
或<body>
标记;根据需要调整您需要这种检测的精确程度(精确度和误报之间始终存在权衡)。