【问题标题】:Fixing broken urls [duplicate]修复损坏的网址 [重复]
【发布时间】:2010-11-29 00:19:16
【问题描述】:

有谁知道修复“损坏”网址的库。当我尝试打开诸如

之类的网址时
http://www.domain.com/../page.html
http://www.domain.com//page.html
http://www.domain.com/page.html#stuff

urllib2.urlopen 阻塞并给我一个 HTTPError 回溯。有谁知道可以解决这些问题的库吗?

【问题讨论】:

  • 最后一个是完全有效的不是吗?
  • 为什么不扫描网址(我认为是在一个网站上),然后用找到的网址,您不能使用正则表达式替换坏的,或者最坏的情况是手动替换它们?
  • @SeanJA:最后一个对浏览器有效,但浏览器会在发送到服务器之前删除#stuff部分。服务器可能会拒绝最后带有#stuff 的URL,这就是OP 发现urlopen 错误的原因。在向服务器询问该 URL 之前,必须删除此类词缀。
  • 我什至不会尝试修复前两个。充其量它们可能是由于过多的复制和粘贴而导致格式错误(缺少“cgi-bin/awesomeblog”部分),最坏的情况是它们试图在 htdocs 之外窥视。您将如何“修复”example.com/../../etc/password 之类的网址
  • 可能首先尝试确定他们为什么错了?

标签: python url urllib2


【解决方案1】:

诸如...之类的东西呢:

import re
import urlparse

urls = '''
http://www.domain.com/../page.html
http://www.domain.com//page.html
http://www.domain.com/page.html#stuff
'''.split()

def main():
  for u in urls:
    pieces = list(urlparse.urlparse(u))
    pieces[2] = re.sub(r'^[./]*', '/', pieces[2])
    pieces[-1] = ''
    print urlparse.urlunparse(pieces)

main()

它确实会如你所愿发出:

http://www.domain.com/page.html
http://www.domain.com/page.html
http://www.domain.com/page.html

如果我理解正确的话,看起来大致符合您的需求。

【讨论】:

  • 对,根据 OP 给出的唯一示例,我只是在路径的开头修复破损。您可以通过path.split('/') 修复更多破损,忽略空块并移除杂散的前导点。但是有更高阶的无限可能损坏的 URL,除非给出一些规范,否则不可能知道要修复什么!-)
猜你喜欢
  • 2010-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-26
  • 1970-01-01
  • 2011-09-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多