Python中的Google网址生成器

1 投票
3 回答
1349 浏览
提问于 2025-04-18 17:57

我正在尝试把谷歌网址生成器的功能添加到我的应用程序中。

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#axzz3ANwb5XD?utm_source=source&utm_medium=medi&utm_campaign=testu

而谷歌的网址生成器返回的是这个链接: 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 的最后面。

撰写回答