【问题标题】:Comparing two urls in Python在 Python 中比较两个 url
【发布时间】:2011-07-19 07:46:07
【问题描述】:

有没有一种标准的方法来比较 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"

我的意思是他们访问相同的资源 - 所以示例中的两个 url 是相同的。

【问题讨论】:

  • 虽然主机名相同,但由于 HTTP 默认使用端口 80,查询字符串完全不同。
  • 严格来说,重新排序查询参数必须得到相同的资源。顺序是可观察的,并且对于某些(病态)服务可能是显而易见的。

标签: python url


【解决方案1】:

使用urlparse 并编写一个与您需要的字段进行比较的函数

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

您可以比较以下任何一项:

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

【讨论】:

  • 很好的解决方案。您只需选择这十个元素中的哪一个需要相等才能被视为相同。
  • 我真的需要自己动手并考虑所有边缘情况吗 - 有没有像 Perl 的 URI::eq (search.cpan.org/dist/URI/URI.pm) 这样的东西?
【解决方案2】:

这是一个简单的类,可以让你做到这一点:

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)

【讨论】:

  • from urllib import unquote_plus 从上面丢失。否则这段代码很酷!谢谢 - 它为我节省了很多时间!
  • 几乎完美。需要考虑路径 '/foo''/foo/' 也是相同的(当然还有 '''/')。
  • MaratC /foo/foo/ 肯定不一样。并且'' 不存在,因为浏览器将其更改为/,但浏览器不会将/foo 更改为/foo/,并且可以引用不同的内容(即文件 foo 与目录 foo)。
【解决方案3】:

【讨论】:

  • 仍在使用 2019 Python 3.7.2
  • urltools 链接已损坏
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-30
  • 1970-01-01
  • 1970-01-01
  • 2011-07-21
  • 2020-09-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多