当试图解析使用msoutlook发送的电子邮件时,我希望能够去掉它添加的恼人的microsoftwalxml标记。一个这样的例子是o:p
标记。当尝试使用Python的beauthoulsoup将电子邮件解析为HTML时,似乎找不到这些特殊标记。在
例如:
from bs4 import BeautifulSoup
textToParse = """
<html>
<head>
<title>Something to parse</title>
</head>
<body>
<p><o:p>This should go</o:p>Paragraph</p>
</body>
</html>
"""
soup = BeautifulSoup(textToParse, "html5lib")
body = soup.find('body')
for otag in body.find_all('o'):
print(otag)
for otag in body.find_all('o:p'):
print(otag)
这将不会向控制台输出文本,但是如果我切换了find_all
调用来搜索p
,那么它将按预期输出p
节点。在
为什么这些自定义标记似乎不起作用?在
这是一个命名空间问题。显然,当使用
"html5lib"
解析时,beauthoulsoup并不认为自定义命名空间有效。在你可以用正则表达式来解决这个问题,奇怪的是,可以正确地工作!在
但是“正确的”解决方案是将解析器改为}作为有效的名称空间。在
^{pr2}$"lxml-xml"
,并引入{相关问题 更多 >
编程相关推荐