比较Python中的两个URL

比较Python中的两个URL,python,url,Python,Url,是否有一种标准方法来比较Python中的两个url?在本例中实现了url\u相同吗: 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是相同的。使用并编写一个带有所需字段的比

是否有一种标准方法来比较Python中的两个url?在本例中实现了
url\u相同吗

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是相同的。

使用并编写一个带有所需字段的比较函数

>>> from urllib.parse import urlparse
>>> o = urlparse('http://www.cwi.nl:80/%7Eguido/Python.html')
您可以对以下任何一项进行比较:

  • 方案0 URL方案说明符
  • netloc 1网络位置部分
  • 路径2分层路径
  • 最后一个路径元素的参数3
  • 查询4查询组件
  • 片段5片段标识符
  • 用户名
  • 密码
  • 主机名主机名(小写)
  • 端口号为整数(如果存在)

  • 下面是一个简单的类,它使您能够执行以下操作:

    if Url(url1) == Url(url2):
        pass
    
    虽然这些对象是可散列的,因此您可以使用集合或字典将它们添加到缓存中,但可以轻松地将其修改为函数:

    # Python 2
    from urlparse import urlparse, parse_qsl
    from urllib import unquote_plus
    # Python 3
    # from urllib.parse import urlparse, parse_qsl, 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)
    
    解放党

    看看我的项目 我也在做同样的事情


    虽然主机名是等效的,但由于HTTP默认设置为端口80,QueryString是完全不同的。重新排序查询参数必须产生相同的资源,这一点严格来说并不正确。顺序是可以观察到的,并且对于某些(路径)服务来说可能是显而易见的。这是一个很好的解决方案。你只需要选择这十个元素中哪一个是相等的,它们就被认为是相同的。我真的需要自己翻滚并考虑所有的边缘情况吗?没有什么像Perl的URI::从ULLIB导入到uQuoTyPule >从上面丢失。否则这段代码很酷!谢谢-这节省了我很多时间!几乎完美。需要考虑的是路径<代码> /FoO 和<代码> /Fo//'/Cuth]也是相同的(当然还有<代码> > />代码>和<代码> > /<代码>当然。MaratC <代码> /FoO 和<代码> /Foo/< /Cord>当然是不一样的。当浏览器将其更改为
    /
    时,
    '
    不存在,但浏览器不会将
    /foo
    更改为
    /foo/
    ,并且可以引用不同的内容(即文件foo与目录foo)。仍在使用2019 Python 3.7.2