Python中的Google网址生成器
我正在尝试把谷歌网址生成器的功能添加到我的应用程序中。
https://support.google.com/analytics/answer/1033867?hl=en
可惜的是,我不太确定能否得到准确的结果。
我的代码
def buildurl(url):
#take out old url builder
url = sub('\?utm_source=.*?(&|$)utm_medium=.*?(&|$)|utm_term=.*?(&|$)|utm_content=.*?(&|$)|utm_campaign=.*?(&|$)','',url)
#build url
header += '?utm_source=' + self.data['source']
header += '&utm_medium=' + self.data['medium']
header += '&utm_campaign=' + self.data['campaign']
#return long url
return(url header + urllib.quote(header)
而谷歌的网址生成器返回的是这个链接: http://iipdigital.usembassy.gov/st/english/article/2014/08/20140813305633.html?utm_source=source&utm_medium=medi&utm_campaign=test#axzz3ANwb5XDu
我可以把#axzz3ANwb5XDu放到后面,但有没有办法以标准化的方式解析和重构这个网址呢?
3 个回答
0
有一种方法可以解析网址,这个方法叫做 urlparse
:
try:
from urllib.parse import urlparse, urlunparse
except ImportError: # Python 2.x
from urlparse import urlparse, urlunparse
def buildurl(url):
scheme, netloc, path, params, query, fragment = urlparse(url)
#take out old url builder
query = sub('\?utm_source=.*?(&|$)utm_medium=.*?(&|$)|utm_term=.*?(&|$)|utm_content=.*?(&|$)|utm_campaign=.*?(&|$)', '', query)
#build url
query += '?utm_source=' + self.data['source']
query += '&utm_medium=' + self.data['medium']
query += '&utm_campaign=' + self.data['campaign']
return urlunparse((scheme, netloc, path, params, query, fragment))
1
我推荐使用Python的urllib库,因为它是内置的库。
import urllib.parse
getVars = {'var1': 'some_data', 'var2': 1337}
url = 'http://domain.com/somepage/?'
print(url + urllib.parse.urlencode(getVars))
输出结果:
http://domain.com/somepage/?var2=1337&var1=some_data
1
你可以看看这个 urlparse 模块。我已经修改了你的代码,去掉了原有的 URL 生成部分,但保留了查询中的其他部分。
from urlparse import urlparse, urlunparse
def buildurl(url):
#take out old url builder.
url = sub('utm_source=.*?(&|$)utm_medium=.*?(&|$)|utm_term=.*?(&|$)|utm_content=.*?(&|$)|utm_campaign=.*?(&|$)','',url)
#Parse the url.
o = urlparse(url)
#build url query.
query = o.query
query += 'utm_source=' + self.data['source']
query += '&utm_medium=' + self.data['medium']
query += '&utm_campaign=' + self.data['campaign']
#return the url with the corrected query.
return urlunparse(o.scheme, o.netloc, o.path, o.params, query, o.fragment)
而且,片段标识符 应该放在 URL 的最后面。