我正在尝试将 mailto URL 解析为一个不错的对象或字典,其中包括
subject
、body
等。我似乎找不到实现此目的的库或类 - 你知道吗?
mailto:[email protected]?subject=mysubject&body=mybody
您可以使用 urlparse 和 parse_qs 来解析以 mailto 为方案的 url。请注意,根据方案定义:
mailto:[email protected],[email protected]?subject=mysubject
等同于
mailto:[email protected]&[email protected]&subject=mysubject
举个例子:
from urlparse import urlparse, parse_qs
from email.message import Message
url = 'mailto:[email protected]?subject=mysubject&body=mybody&[email protected]'
msg = Message()
parsed_url = urlparse(url)
header = parse_qs(parsed_url.query)
header['to'] = header.get('to', []) + parsed_url.path.split(',')
for k,v in header.iteritems():
msg[k] = ', '.join(v)
print msg.as_string()
# Will print:
# body: mybody
# to: [email protected], [email protected]
# subject: mysubject
核心 urlparse 库在 mailtos 上的表现不尽如人意,但可以帮助您完成一半:
In [3]: from urlparse import urlparse
In [4]: urlparse("mailto:[email protected]?subject=mysubject&body=mybody")
Out[4]: ParseResult(scheme='mailto', netloc='', path='[email protected]?subject=mysubject&body=mybody', params='', query='', fragment='')
编辑
一点研究发现这个线程。底线:python url 解析很烂。
似乎您可能只想编写自己的函数来执行此操作。
编辑: 这是一个示例函数(由 python noob 编写)。
编辑2,清理反馈:
from urllib import unquote
test_mailto = 'mailto:[email protected]?subject=mysubject&body=mybody'
def parse_mailto(mailto):
result = dict()
colon_split = mailto.split(':',1)
quest_split = colon_split[1].split('?',1)
result['email'] = quest_split[0]
for pair in quest_split[1].split('&'):
name = unquote(pair.split('=')[0])
value = unquote(pair.split('=')[1])
result[name] = value
return result
print parse_mailto(test_mailto)
这是一个使用 re 模块的解决方案...
import re
d={}
def parse_mailto(a):
m=re.search('mailto:.+?@.+\\..+?', a)
email=m.group()[7:-1]
m=re.search('@.+?\\..+?\\?subject=.+?&', a)
subject=m.group()[19:-1]
m=re.search('&.+?=.+', a)
body=m.group()[6:]
d['email']=email
d['subject']=subject
d['body']=body
这假设它的格式与您发布的格式相同。您可能需要进行修改以更好地满足您的需求。
包括电池:urlparse.
import urllib
query = 'mailto:[email protected]?subject=mysubject&body=mybody'.partition('?')[2]
print dict((urllib.unquote(s).decode('utf-8') for s in pair.partition('=')[::2])
for pair in query.split('&'))
# -> {u'body': u'mybody', u'subject': u'mysubject'}
你应该像那样使用特殊的图书馆
https://pypi.python.org/pypi/urlinfo
并贡献和创建问题以使 Python 变得更好;)
附言不使用 Robbert Peters 解决方案 bcz 它被破解并且无法正常工作。同样使用正则表达式的是使用超级 BFG Gun 来获得小鸟。
我喜欢亚历山大的回答,但它是在 Python 2 中!我们现在从
urlparse()
得到 parse_qs()
和 urllib.parse
。另请注意,对标题进行反向排序会将其按顺序排列:to,from,body。
from email.message import Message
from pathlib import Path
from urllib.parse import parse_qs, urlparse
url = Path("link.txt").read_text()
msg = Message()
parsed_url = urlparse(url)
header = parse_qs(parsed_url.query)
header["to"] = header.get("to", []) + parsed_url.path.split(",")
for k, v in sorted(header.items(), reverse=True):
print(f"{k}:", v[0])
我只是一次性使用它,当我使用
msg.as_string()
时,我得到了一些奇怪的结果,所以我只是使用了字符串。这些值是一个值的列表,所以我访问第 0 个条目以使其成为一个字符串。