Сравнение двух URL в Python - PullRequest
       1

Сравнение двух URL в Python

14 голосов
/ 21 марта 2011

Существует ли стандартный способ сравнения двух URL-адресов в Python, который реализует are_url_the_same в этом примере:

url_1 = 'http://www.foo.com/bar?a=b&c=d'
url_2 = 'http://www.foo.com:80/bar?c=d;a=b'

if are_urls_the_same(url_1, url2):
    print "URLs are the same"

Под тем же самым я имею в виду, что они обращаются к одному и тому же ресурсу - поэтому два URL-адреса впример одинаковый.

Ответы [ 3 ]

12 голосов
/ 27 февраля 2012

Вот простой класс, который позволяет вам сделать это:

if Url(url1) == Url(url2):
    pass

Его можно легко перестроить как функцию, хотя эти объекты могут быть хэшируемыми и, следовательно, позволяют добавлять их в кэш с помощью набора или словаря:

from urlparse import urlparse, parse_qsl
from urllib import unquote_plus

class Url(object):
    '''A url object that can be compared with other url orbjects
    without regard to the vagaries of encoding, escaping, and ordering
    of parameters in query strings.'''

    def __init__(self, url):
        parts = urlparse(url)
        _query = frozenset(parse_qsl(parts.query))
        _path = unquote_plus(parts.path)
        parts = parts._replace(query=_query, path=_path)
        self.parts = parts

    def __eq__(self, other):
        return self.parts == other.parts

    def __hash__(self):
        return hash(self.parts)
6 голосов
/ 09 сентября 2013

Lib https://github.com/rbaier/urltools

Посмотрите на мой проект, я делаю то же самое

https://github.com/tg123/tao.bb/blob/master/url_normalize.py

6 голосов
/ 21 марта 2011

Используйте urlparse и напишите функции сравнения с полями, которые вам нужны

>>> from urlparse import urlparse
>>> o = urlparse('http://www.cwi.nl:80/%7Eguido/Python.html')

И вы можете сравнить по любому из следующих:

  1. схема 0 Спецификатор схемы URL
  2. netloc 1 Часть сетевого расположения
  3. путь 2 Иерархический путь
  4. params 3 Параметры для последнего элемента пути
  5. запрос 4 Компонент запроса
  6. фрагмент 5 Идентификатор фрагмента
  7. имя пользователя Имя пользователя
  8. пароль Пароль
  9. имя хоста Имя хоста (нижний регистр)
  10. номер порта Номер порта в виде целого числа, если имеется
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...