【问题标题】:Python 3 normalize URLPython 3 规范化 URL
【发布时间】:2013-07-14 01:05:00
【问题描述】:

好吧,显然 python 3 在 urllib 方面非常可笑。

所以,我有一个这样的网址,格式如下,

http_request = "http://localhost/system/index.php/index_file/store?cid={0}&cname={1}&fname={2}&fdir='{3}'"\
                       .format(client_id, client_name, each[1], each[2])

其中each[1]each[2] 分别是文件名和文件目录。

所以 http_request 通过 print() 生成的结果会给出这样的结果,

http://localhost/system/index.php/index_file/store? \
cid=90823&cname=John Smith&fname=Sample Document.doc& \
fdir='C:\Users\williamyang\Desktop\Files\90823 Michelle Moore\Sample Document.doc'

(单独的反斜杠的目的是让它更适合这里。实际的代码在每行的末尾没有单独的反斜杠。)

如果我将该 URL 输入到浏览器中,那就太好了。 PHP 应用程序通过 $_GET 接收所有索引,然后转到 MySQL,没有问题。

但如果我让python来做,

PHP 告诉我索引 $_GET['fname']$_GET['fdir'] 不存在!!!多么疯狂。好的,那么,

我尝试了 urllib.parse、urllib 编码和解码、http_request.replace('\\', '/') 以及许多其他方法。

这些都不起作用。

我的教授曾经告诉我,python 在字符编码方面做了一些有趣的事情。

在所有疯狂和无用的 urllib 解析实验之前,这是我发送 URL 的方式

def getResponseCode(url):        
    conn = urllib.request.urlopen((url))
    return conn.read()

在哪里url = http_request

我该如何解决这个问题?

PHP 说 $_GET['fname'] and $_GET['fdir'] 不存在

但是当我将自动生成的 http_request 粘贴到浏览器中时,

一切都好

【问题讨论】:

  • 你能在发送之前print repr(url)看看输出什么吗?
  • 'http://localhost/system/index.php/index_file/store?cid=90823&cname=Michelle Moore&fname=Sample Document.doc&fdir='C:\\Users\\williamyang\\Desktop\\Forms\\90823 Michelle Moore\\Sample Document.doc'
  • 对于双反斜杠我无能为力。 Python 3 只是拒绝我这样做。我在某处读到双反斜杠被解释为单个正斜杠。我认为这可能是问题所在。 replace('\\', '/') 也不是 replace('\\\\', '/') 有效
  • 目录是使用os.walk()生成的。因此反斜杠
  • 不,反斜杠应该没问题。这只是 Python 为 repr 转义了反斜杠,否则你将无法判断 '\n' 是换行符还是反斜杠和 'n'。

标签: php python mysql web-applications


【解决方案1】:

网址不应包含空格。您的浏览器会自动对 URL 进行百分比编码,按照 URL 转义规则,将不应出现在 URL 中的字符替换为 %20+。 Python 不会自动执行此操作;最有可能的是,便利性引入了对编程很重要的歧义,但不会打扰普通网络用户。用于url转义的Python工具是urllib.quote and urllib.quote_plus;你可能想要quote_plus。将 URL 的路径组件传递给urllib.quote_plus,然后再将其粘贴到域名上,您应该可以开始了。

【讨论】:

    【解决方案2】:

    python 2 的解决方案: How can I normalize a URL in python

    python 3 的解决方案:

    莫名其妙的解决方案>

    从 os.walk() 读取目录后立即执行 var.replace(" ", "_")

    在php端,

    $var = str_replace('_', ' ', $_GET['var']);

    【讨论】:

      猜你喜欢
      • 2021-02-09
      • 1970-01-01
      • 2012-05-22
      • 2010-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-30
      相关资源
      最近更新 更多