Beautifulsoup使用find()

时间:2017-05-17 10:07:28

标签: python beautifulsoup

我从另一个开发人员继承了一个函数,该函数应该检查电子邮件消息的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的熟悉程度不够。我是在正确的轨道上吗?

1 个答案:

答案 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>标记;根据需要调整您需要这种检测的精确程度(精确度和误报之间始终存在权衡)。