2012-01-30 4 views
2

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

mailto:[email protected]?subject=mysubject&body=mybody 
+2

с помощью 're' модуль может быть быстрое решение – juliomalegria

ответ

1

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

Редактировать: Вот примерная функция (написанная python noob).

Edit 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) 
+0

Работала для меня - Спасибо Robert – Yarin

+1

Вы должны, вероятно, использовать '.split (sep, 1)', чтобы ограничить один сплит, и сохранить результаты вместо разделения несколько раз. Кроме того, вам понадобится 'urllib.unquote()' для декодирования '% xx' placeholders в строках и переменных строки запроса. –

+0

круто, спасибо за советы. –

0

Батареи прилагаются: urlparse.

+0

+1. Он продолжает идти, и идет, и идет ... – kindall

+0

Не работает-urlparse result = 'ParseResult (schem = 'mailto', netloc = '', path='[email protected]?subject = mysubject & body = mybody ', params =' ', query =' ', fragment =' ') '- Не читает subject/body/etc – Yarin

2

Ядро urlparse Lib делает меньше звездной работы на 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='') 

EDIT

Небольшое исследование раскапывает this thread. Итог: синтаксический анализ URL-адреса python.

+0

Почему он не улавливает часть запроса, меня удаляет, tho' –

+0

Пробовал это - похоже, ничего не делает, кроме захвата схемы – Yarin

+0

Он также должен расшифровать фрагменты кода. Никакого большого подвига, но все же. –

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

Спасибо bladerunner, это тоже работает. Предоставило его Роберту, потому что он был первым – Yarin

1

Вот решение, используя модуль повторно ...

import re 

d={} 
def parse_mailto(a): 
    m=re.search('mailto:[email protected]+\\..+?', 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 

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

0

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

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

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

P.S. Не использует Robbert Peters решение bcz, оно взломает и не работает должным образом. Также использование регулярного выражения использует супер BFG Gun для получения маленькой птицы.

2

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

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