Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中解析mailto URL_Python_Mailto_Url Parsing - Fatal编程技术网

在Python中解析mailto URL

在Python中解析mailto URL,python,mailto,url-parsing,Python,Mailto,Url Parsing,我正在尝试将mailto URL解析为一个很好的对象或字典,其中包括主题,正文,等等。我似乎找不到一个实现这一点的库或类-你知道任何库或类吗 mailto:me@mail.com?subject=mysubject&body=mybody 看起来您可能只想编写自己的函数来实现这一点 编辑: 下面是一个示例函数(由python noob编写) 编辑2,清理要执行的反馈: from urllib import unquote test_mailto = 'mailto:me@mail.co

我正在尝试将mailto URL解析为一个很好的对象或字典,其中包括
主题
正文
,等等。我似乎找不到一个实现这一点的库或类-你知道任何库或类吗

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

看起来您可能只想编写自己的函数来实现这一点

编辑: 下面是一个示例函数(由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)

电池包括:.

核心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解析很糟糕。

这里有一个使用re模块的解决方案

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'}
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

这假设它与您发布的格式相同。您可能需要进行修改以更好地满足您的需要。

您应该使用这样的特殊库

并贡献和创建问题,使Python变得更好;)


p.S.未使用Robbert Peters解决方案bcz it hack,且无法正常工作。使用正则表达式还可以使用super BFG Gun来获取small bird。

您可以使用URLPASE和parse_qs来解析使用mailto作为方案的URL。请注意,根据:

与相同

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

使用
re
模块可能是一个快速的解决方案,为什么它不能捕获查询部分,尽管我尝试过,但它似乎除了抓取模式之外什么都不做。它还应该对块进行url解码。没有什么了不起的成就,但仍然是。
urlparse()
返回正确的结果。请看,针对主题转到RFC确实很奇怪,但碰巧urlparse对于RFC或其自己的文档甚至都不正确,因为它声称要分离查询部分,但实际上并没有。“URI=scheme”:“hier part[”?“query][“#”fragment]”不起作用-urlparse result=
ParseResult(scheme='mailto',netloc='',path='fontme@mail.com?subject=mysubject&body=mybody',params='',query='',fragment='')
-不读取subject/body/etcThanks bladerrunner,这也有效-将它交给Robert,因为他是第一个。您可能应该使用
.split(sep,1)
来限制一次拆分,并保存结果,而不是多次拆分。另外,您需要
urllib.unquote()
来解码查询字符串键和变量中的
%xx
占位符。
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