Разбор почтовых адресов в Python - PullRequest
2 голосов
/ 30 января 2012

Я пытаюсь разобрать URL-адреса mailto в хороший объект или словарь, который включает subject, body и т. Д. Я не могу найти библиотеку или класс, который достигает этого - Знаете ли вы что-нибудь?

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

Ответы [ 7 ]

2 голосов
/ 30 января 2012

Ядро 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 сосет.

2 голосов
/ 30 июля 2015

Вы можете использовать urlparse и parse_qs для анализа URL с mailto как схемой.Имейте в виду, что согласно определение схемы :

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
1 голос
/ 30 января 2012

Вот решение с использованием модуля 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

Предполагается, что оно в том же формате, что и вы.Возможно, вам придется внести изменения, чтобы лучше соответствовать вашим потребностям.

1 голос
/ 30 января 2012

Похоже, вы можете просто написать свою собственную функцию для этого.

Edit: Вот пример функции (написанный нубом из Python).

Редактировать 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)
0 голосов
/ 14 мая 2015

Вы должны использовать специальную библиотеку, подобную этой

https://pypi.python.org/pypi/urlinfo

и внесите свой вклад и создайте проблему, чтобы сделать Python лучше;)

P.S. Не использует решение Роберта Питерса, оно не работает должным образом. Также с помощью регулярного выражения используется супер BFG Gun, чтобы получить маленькую птичку.

0 голосов
/ 30 января 2012
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'}
0 голосов
/ 30 января 2012

Батарейки в комплекте: urlparse .

...