2012-05-14 4 views
9

파이썬에서 경로를 "./"또는 "../"부분을 제거하거나 기본 포트를 추가하거나 특수 문자를 이스케이프 처리하는 등 라이브러리 함수를 검색하고 있습니다. 결과는 동일한 웹 페이지를 가리키는 두 URL에 대해 고유 한 문자열이어야합니다. 예를 들어 http://google.comhttp://google.com:80/a/../은 같은 결과를 반환합니다.URL을 정규화/정규화 하시겠습니까?

파이썬 3을 선호하고 이미 urllib 모듈을 살펴 보았습니다. URL 분할 기능을 제공하지만 표준화는 없습니다. 자바는 비슷한 것을하는 URI.normalize() 함수를 가지고있다. (기본 포트 80은 주어진 포트와 같지 않다.)하지만 파이썬 같은 것이 있는가? 이것에 대해

+0

'에 http : // google.com /는'HTTP'보다 동일하지 않습니다 : // 구글 .com : 80/a/... /'. 즉,'/ a'가 존재하지 않으면, 두 번째 경로는 실패합니다. "canonicalizing"함으로써, 당신은 특별한 경우를 잃고 유효하지 않은 URI로 시작했을 때 ... –

답변

0

good start에 이어 웹에서 흔히 발견되는 대부분의 경우에 맞는 방법으로 작성했습니다.

def urlnorm(base, link=''): 
    '''Normalizes an URL or a link relative to a base url. URLs that point to the same resource will return the same string.''' 
    new = urlparse(urljoin(base, url).lower()) 
    return urlunsplit((
    new.scheme, 
    (new.port == None) and (new.hostname + ":80") or new.netloc, 
    new.path, 
    new.query, 
    '')) 
4

방법 :

In [1]: from urllib.parse import urljoin 

In [2]: urljoin('http://example.com/a/b/c/../', '.') 
Out[2]: 'http://example.com/a/b/' 

this question에 대한 답변에서 영감을. 포트를 표준화하지는 않지만, 기능을 수행하는 것은 간단해야합니다.

+0

'urllib.parse'가 없지만'urlparse'를 가지고 있습니다. – osa

+3

'urllib.parse'는 파이썬 3의 위치입니다 - 원래 질문은 Py 3에 대해 질문했습니다. –

4

이것은 내가 사용하는 것으로 지금까지 효과가 있습니다. 핍에서 urlnorm을 얻을 수 있습니다.

쿼리 매개 변수를 정렬합니다. 나는 이것이 필수적이라는 것을 알았다.

from urlparse import urlsplit, urlunsplit, parse_qsl 
from urllib import urlencode 
import urlnorm 

def canonizeurl(url): 
    split = urlsplit(urlnorm.norm(url)) 
    path = split[2].split(' ')[0] 

    while path.startswith('/..'): 
     path = path[3:] 

    while path.endswith('%20'): 
     path = path[:-3] 

    qs = urlencode(sorted(parse_qsl(split.query))) 
    return urlunsplit((split.scheme, split.netloc, path, qs, '')) 
+0

잘못된 부모 디렉토리를 제거합니다 – hoju

+0

'split [2] .split ('') [0]'을' urllib.parse.quote (split [2])'- 경우에 따라 URL에 공백이 있으면 실제로는 정상이며 실제로 필요합니다. 또한 urlnorm은 py2k 만입니다 –

+0

또한 일부 예외적 인 경우 실제로 필요한 URL 구성 요소 일 수있는 조각을 삭제합니다. 예, 'blah.com/# wat'이 완전히 다른 페이지이고 'blah.com /'인 웹 페이지가 0이 아닙니다. 일반적으로 자바 스크립트로 처리되며 엄청난 PITA이지만 존재합니다. –

2

urltools 모듈은 http://에 이중 슬래시를 엉망으로하지 않고 여러 슬래시, ... 구성 요소를 정상화. 당신이 pip install urltools을하면 다음과 같이

이 사용은 다음과 같습니다 보조 노트와 같은 자원으로

print urltools.normalize('http://domain.com:80/a////b/../c') 
>>> 'http://domain.com/a/c' 
관련 문제