在Python中解码Microsoft Safelink URL

时间:2017-09-30 15:09:13

标签: python urldecode

import re
import urllib
import HTMLParser

urlRegex = re.compile(r'(.+)&data=')
match=urlRegex.search('https://na01.safelinks.protection.outlook.com/?url=https%3A%2F%2Foffice.memoriesflower.com%2FPermission%2F%2525%2524%255E%2526%2526*%2523%2523%255E%2524%2525%255E%2526%255E*%2526%2523%255E%2525%2525%2526%2540%255E*%2523%2526%255E%2525%2523%2526%2540%2525*%255E%2540%255E%2523%2525%255E%2540%2526%2525*%255E%2540%2Foffice.php&data=01%7C01%7Cdavid.levin%40mheducation.com%7C0ac9a3770fe64fbb21fb08d50764c401%7Cf919b1efc0c347358fca0928ec39d8d5%7C0&sdata=PEoDOerQnha%2FACafNx8JAep8O9MdllcKCsHET2Ye%2B4%3D&reserved=0')

x = match.group()
urlRegex_1 = re.compile(r'url=(.+)&data=')
match_1 = urlRegex_1.search(x)
print match1.group(1)
htmlencodedurl = urllib.unquote(urllib.unquote(match1.group(1)))
actual_url = HTMLParser.HTMLParser().unescape(htmlencodedurl)

所以' actual_url'显示这个: ' https://office.memoriesflower.com/Permission/% $ ^&安培;&安培; ## ^ $%^&安培; ^ &安培;#^ %%&安培; @ ^ *#&安培; ^%&#39 ;

我需要它来显示:

https://office.memoriesflower.com/Permission/office.php

2 个答案:

答案 0 :(得分:0)

我发现这也有类似的问题。这是我用来解决问题的代码。它不是特别优雅,但是您可以根据需要对其进行调整。

self.urls = (re.findall("safelinks\.protection\.outlook\.com/\?url=.*?sdata=", self.body.lower(), re.M))
if len(self.urls) > 0:
    for i, v in enumerate(self.urls):
        self.urls[i] = v[38:-11]

这可以通过以丑陋的格式获取值,然后将每个项目的多余部分作为字符串剥离来起作用。我相信正确的方法是使用分组,但是这种方法足以满足我的需求。

答案 1 :(得分:0)

以下内容更干净,因为它使用urlparse提取查询字符串,然后使用路径操作删除不需要的组件:

import posixpath as path
from urlparse import urlparse, parse_qs, urlunparse
url = 'https://na01.safelinks.protection.outlook.com/?url=https%3A%2F%2Foffice.memoriesflower.com%2FPermission%2F%2525%2524%255E%2526%2526*%2523%2523%255E%2524%2525%255E%2526%255E*%2526%2523%255E%2525%2525%2526%2540%255E*%2523%2526%255E%2525%2523%2526%2540%2525*%255E%2540%255E%2523%2525%255E%2540%2526%2525*%255E%2540%2Foffice.php&data=01%7C01%7Cdavid.levin%40mheducation.com%7C0ac9a3770fe64fbb21fb08d50764c401%7Cf919b1efc0c347358fca0928ec39d8d5%7C0&sdata=PEoDOerQnha%2FACafNx8JAep8O9MdllcKCsHET2Ye%2B4%3D&reserved=0'
target = parse_qs(urlparse(url).query)['url'][0]
p = urlparse(target)
q = p._replace(path=path.join(path.dirname(path.dirname(p.path)), path.basename(p.path)))
print urlunparse(q)

打印https://office.memoriesflower.com/Permission/office.php