在Python中比较两个网址

Evd*_*vdB 15 python url

是否有一种标准方法来比较Python中的两个URL - 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"
Run Code Online (Sandbox Code Playgroud)

同样我的意思是他们访问相同的资源 - 所以示例中的两个网址是相同的.

twn*_*ale 11

这是一个简单的类,使您可以执行此操作:

if Url(url1) == Url(url2):
    pass
Run Code Online (Sandbox Code Playgroud)

它可以很容易地作为一个函数进行修改,虽然这些对象是可以清除的,因此可以使用set或dictionary将它们添加到缓存中:

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)
Run Code Online (Sandbox Code Playgroud)

  • 几乎完美。需要考虑的是路径''/ foo'`和`'/ foo /'`也一样(当然还有`''`和`'/'`)。 (2认同)
  • MaratC`/ foo`和`/ foo /`肯定是不一样的。当浏览器将其更改为`/`时,`''不存在,但是浏览器不会将/ foo`更改为`/ foo /`,并且可以引用不同的内容(即文件foo与目录foo)。 (2认同)

fab*_*ioM 7

使用urlparse并将compare函数与您需要的字段一起编写

>>> from urllib.parse import urlparse
>>> o = urlparse('http://www.cwi.nl:80/%7Eguido/Python.html')
Run Code Online (Sandbox Code Playgroud)

你可以比较以下任何一个:

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

  • 我真的需要自己动手并考虑所有边缘情况吗?没有像 Perl 的 URI::eq (http://search.cpan.org/dist/URI/URI.pm) 这样的东西吗? (2认同)