2012-07-24 5 views

답변

0
import re 
from urlparse import urlparse, urlunparse 

url = 'http://www.someurl.com/page.html?foo=bar&utm_medium=qux&baz=qoo' 
parsed_url = list(urlparse(url)) 
parsed_url[4] = '&'.join(
    [x for x in parsed_url[4].split('&') if not re.match(r'utm_', x)]) 
utmless_url = urlunparse(parsed_url) 

print utmless_url # 'http://www.someurl.com/page.html?foo=bar&baz=qoo' 
+0

여기에서're'을 사용하는 이유는 무엇입니까? 간단한'x.startswith ('utm _')'가 그것을 할 것입니다. – jadkik94

+0

네,'re' 표현식은'startswith'로 바꿀 수 있습니다. 나는 Jon Clement의 대답을 보았을 때까지 몰랐습니다. :) – mVChr

8

다소 길지만 url * 모듈을 사용하고 re를 피합니다.

from urllib import urlencode 
from urlparse import urlparse, parse_qs, urlunparse 

url = 'http://whatever.com/somepage?utm_one=3&something=4&utm_two=5&utm_blank&something_else' 

parsed = urlparse(url) 
qd = parse_qs(parsed.query, keep_blank_values=True) 
filtered = dict((k, v) for k, v in qd.iteritems() if not k.startswith('utm_')) 
newurl = urlunparse([ 
    parsed.scheme, 
    parsed.netloc, 
    parsed.path, 
    parsed.params, 
    urlencode(filtered, doseq=True), # query string 
    parsed.fragment 
]) 

print newurl 
# 'http://whatever.com/somepage?something=4&something_else' 
+2

문제는 쿼리 매개 변수의 순서가 변경되고 값이없는 params에 "="을 추가한다는 것입니다. 이것은 * 문제가 아니어야하지만 (이와 비슷한 것을 쓰는 동안 발견했습니다)저기서 그런 사이트에 의존하는 사이트가 있습니다. 예를 들어, 특정 사이트에서 http://www.example.com/?32423&foo=bar&a=b는 http://www.example.com/?a=b&foo=bar&32423=로 다시 쓸 수 없습니다. 예, 사이트는 다음과 같습니다. 어리 석고 틀렸고 쿼리 매개 변수 순서에 의존해서는 안됩니다. 그러나 실제 사이트 인 경우 (작은 사이트가 아닌 경우) 반드시 무시할 수는 없습니다 .--( –

1

단순하고, 작품, 그리고 당신이 게시 된 링크를 기반으로하지만, 그것은 ... 그것이 내가 :)

생각할 수 없다 어떤 이유로 중단되지 않도록 확실하지 재보험의
import re 

def trim_utm(url): 
    if "utm_" not in url: 
     return url 
    matches = re.findall('(.+\?)([^#]*)(.*)', url) 
    if len(matches) == 0: 
     return url 
    match = matches[0] 
    query = match[1] 
    sanitized_query = '&'.join([p for p in query.split('&') if not p.startswith('utm_')]) 
    return match[0]+sanitized_query+match[2] 

if __name__ == "__main__": 
    tests = [ "http://localhost/index.php?a=1&utm_source=1&b=2", 
       "http://localhost/index.php?a=1&utm_source=1&b=2#hash", 
       "http://localhost/index.php?a=1&utm_source=1&b=2&utm_something=no#hash", 
       "http://localhost/index.php?a=1&utm_source=1&utm_a=yes&b=2#hash", 
       "http://localhost/index.php?utm_a=a", 
       "http://localhost/index.php?a=utm_a", 
       "http://localhost/index.php?a=1&b=2", 
       "http://localhost/index.php", 
       "http://localhost/index.php#hash2" 
      ] 

    for t in tests: 
     trimmed = trim_utm(t) 
     print t 
     print trimmed 
     print 
0

어때? 멋지고 단순한 :

url = 'https://searchengineland.com/amazon-q3-ad-revenues-surpass-1-billion-roughly-2x-early-2016-285763?utm_source=feedburner&utm_medium=feed&utm_campaign=feed-main' 

print url[:url.find('?utm')] 

https://searchengineland.com/amazon-q3-ad-revenues-surpass-1-billion-roughly-2x-early-2016-285763 
관련 문제