在Python中解析mail-to-url



我正试图将mailto URL解析为一个不错的对象或字典,其中包括subjectbody等。我似乎找不到实现这一点的库或类-你知道吗?

mailto:me@mail.com?subject=mysubject&body=mybody

您可以使用urlparse和parse_qs来解析使用mailto作为scheme的url。请注意,根据方案定义:

mailto:me@mail.com,you@mail.com?subject=mysubject

与相同

mailto:?to=me@mail.com&to=you@mail.com&subject=mysubject

这里有一个例子:

from urlparse import urlparse, parse_qs
from email.message import Message
url = 'mailto:me@mail.com?subject=mysubject&body=mybody&to=you@mail.com'
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: me@mail.com, you@mail.com
# subject: mysubject

核心urlparse-lib在mailtos上做得不太出色,但却让你半途而废:

In [3]: from urlparse import urlparse
In [4]: urlparse("mailto:me@mail.com?subject=mysubject&body=mybody")
Out[4]: ParseResult(scheme='mailto', netloc='', path='me@mail.com?subject=mysubject&body=mybody', params='', query='', fragment='')

编辑

一点研究就发现了这条线索。一句话:python url解析很糟糕。

您可能只想编写自己的函数来完成这项工作。

编辑:下面是一个示例函数(由python noob编写)。

编辑2,清理做反馈:

from urllib import unquote
test_mailto = 'mailto:me@mail.com?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:me@mail.com?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变得更好;)

p.S.不使用Robbert-Peters解决方案bcz it破解,无法正常工作。同样使用正则表达式是使用超级BFG枪来获得小鸟。

我喜欢Alexander的答案,但它在Python 2中!我们现在从urllib.parse得到urlparse()parse_qs()。还要注意的是,对标题进行反向排序会使其按顺序排列: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个条目,使其成为字符串。

最新更新