복붙노트

[PYTHON] URL에서 호스트 이름 변경하기

PYTHON

URL에서 호스트 이름 변경하기

나는 호스트 이름을 변경하기 위해 파이썬을 사용하려고 노력하고 있으며, 만족스러운 해결책을 찾지 못한 채 잠시 동안 urlparse 모듈로 놀고있다. 예를 들어 URL을 고려해보십시오.

https://www.google.dk:80/barbaz

'www.google.dk'를 예 : "www.foo.dk", 그래서 나는 다음과 같은 URL을 얻는다 :

https://www.foo.dk:80/barbaz.

따라서 대체 할 부분은 urlparse.urlsplit이 호스트 이름을 참조하는 부분입니다. urlsplit의 결과로 인해 변경이 가능하지만 결과로 생성되는 ParseResult 형식이 나를 허용하지 않기를 바랬습니다. 아무것도 할 수 없다면 물론 모든 부분을 +와 함께 추가하여 새 URL을 다시 작성할 수는 있지만 올바른 장소에 ": //"및 ":"을 가져 오는 많은 조건이있는 꽤 추악한 코드를 남겨 둡니다. .

해결법

  1. ==============================

    1.urlparse.urlparse 함수와 ParseResult._replace 메소드를 사용할 수 있습니다.

    urlparse.urlparse 함수와 ParseResult._replace 메소드를 사용할 수 있습니다.

    >>> import urlparse
    >>> parsed = urlparse.urlparse("https://www.google.dk:80/barbaz")
    >>> replaced = parsed._replace(netloc="www.foo.dk:80")
    >>> print replaced
    ParseResult(scheme='https', netloc='www.foo.dk:80', path='/barbaz', params='', query='', fragment='')
    

    ParseResult는 namedtuple의 서브 클래스이고 _replace는 다음과 같은 namedtuple 메소드입니다.

    최신 정보:

    의견에서 @ 2rs2ts는 netloc 속성에 포트 번호가 포함되어 있다고 말했습니다.

    좋은 소식 : ParseResult에는 호스트 이름과 포트 속성이 있습니다. 나쁜 소식 : hostname과 port는 namedtuple의 멤버가 아니며 동적 속성이므로 parsed._replace (hostname = "www.foo.dk")를 수행 할 수 없습니다. 그것은 예외를 던질 것이다.

    분할하지 않으려는 경우 : 귀하의 URL에 항상 포트 번호가 있으며 사용자 이름과 비밀번호가 없습니다 (즉, "https : // 사용자 이름 : password@www.google.dk : 80 / barbaz"와 같은 URL입니다). 넌 할 수있어:

    parsed._replace(netloc="{}:{}".format(parsed.hostname, parsed.port))
    
  2. ==============================

    2.파이썬의 urlparse에서 urlsplit과 urlunsplit을 활용할 수 있습니다 :

    파이썬의 urlparse에서 urlsplit과 urlunsplit을 활용할 수 있습니다 :

    >>> from urlparse import urlsplit, urlunsplit
    >>> url = list(urlsplit('https://www.google.dk:80/barbaz'))
    >>> url
    ['https', 'www.google.dk:80', '/barbaz', '', '']
    >>> url[1] = 'www.foo.dk:80'
    >>> new_url = urlunsplit(url)
    >>> new_url
    'https://www.foo.dk:80/barbaz'
    

    docs 상태에서 urlunsplit ()에 전달 된 인수는 "5 개 항목으로 반복 가능"할 수 있으므로 위 코드는 예상대로 작동합니다.

  3. ==============================

    3.urlparse 모듈의 urlparse 및 urlunparse 메소드 사용 :

    urlparse 모듈의 urlparse 및 urlunparse 메소드 사용 :

    import urlparse
    
    old_url = 'https://www.google.dk:80/barbaz'
    url_lst = list(urlparse.urlparse(old_url))
    # Now url_lst is ['https', 'www.google.dk:80', '/barbaz', '', '', '']
    url_lst[1] = 'www.foo.dk:80'
    # Now url_lst is ['https', 'www.foo.dk:80', '/barbaz', '', '', '']
    new_url = urlparse.urlunparse(url_lst)
    
    print(old_url)
    print(new_url)
    

    산출:

    https://www.google.dk:80/barbaz
    https://www.foo.dk:80/barbaz
    
  4. ==============================

    4.netloc에서 호스트의 간단한 문자열 대체는 대부분의 경우에도 작동합니다.

    netloc에서 호스트의 간단한 문자열 대체는 대부분의 경우에도 작동합니다.

    >>> p = urlparse.urlparse('https://www.google.dk:80/barbaz')
    >>> p._replace(netloc=p.netloc.replace(p.hostname, 'www.foo.dk')).geturl()
    'https://www.foo.dk:80/barbaz'
    

    어떤 경우에 사용자 이름이나 암호가 호스트 이름과 일치 할 경우에는 작동하지 않습니다. 마지막 발생 만 바꾸기 위해 str.replace를 제한 할 수 없으므로 대신 split 및 join을 사용할 수 있습니다.

    >>> p = urlparse.urlparse('https://www.google.dk:www.google.dk@www.google.dk:80/barbaz')
    >>> new_netloc = 'www.foo.dk'.join(p.netloc.rsplit(p.hostname, 1))
    >>> p._replace(netloc=new_netloc).geturl()
    'https://www.google.dk:www.google.dk@www.foo.dk:80/barbaz'
    
  5. ==============================

    5.나는 또한 @ linkyndy의 대답처럼 urlsplit과 urlunsplit을 사용하는 것을 권하고 싶지만, Python3의 경우에는 다음과 같다.

    나는 또한 @ linkyndy의 대답처럼 urlsplit과 urlunsplit을 사용하는 것을 권하고 싶지만, Python3의 경우에는 다음과 같다.

    >>> from urllib.parse import urlsplit, urlunsplit
    >>> url = list(urlsplit('https://www.google.dk:80/barbaz'))
    >>> url
    ['https', 'www.google.dk:80', '/barbaz', '', '']
    >>> url[1] = 'www.foo.dk:80'
    >>> new_url = urlunsplit(url)
    >>> new_url
    'https://www.foo.dk:80/barbaz'
    
  6. ==============================

    6.사용중인 포트 (있는 경우)를 건드리지 않고 호스트를 바꾸려면 다음을 사용하십시오.

    사용중인 포트 (있는 경우)를 건드리지 않고 호스트를 바꾸려면 다음을 사용하십시오.

    import re, urlparse
    
    p = list(urlparse.urlsplit('https://www.google.dk:80/barbaz'))
    p[1] = re.sub('^[^:]*', 'www.foo.dk', p[1])
    print urlparse.urlunsplit(p)
    

    인쇄물

    https://www.foo.dk:80/barbaz
    

    포트를 제공하지 않으면 잘 작동합니다.

    니겔 (Nigel)이 _replace 방식을 선호했다면 다음과 같이 대신 사용할 수 있습니다.

    p = urlparse.urlsplit('https://www.google.dk:80/barbaz')
    p = p._replace(netloc=re.sub('^[^:]*', 'www.foo.dk', p.netloc))
    print urlparse.urlunsplit(p)
    
  7. from https://stackoverflow.com/questions/21628852/changing-hostname-in-a-url by cc-by-sa and MIT license