【问题标题】:Quote path part of URL but not parameters引用 URL 的路径部分,但不引用参数
【发布时间】:2020-01-22 10:05:39
【问题描述】:

我有一个如下形式的 URL https://website.com/chill & relax/folder/file.txt?a=1&b=2(该链接是一个虚拟示例,它不能正常工作)

当我将这个 URL 粘贴到 Firefox 中时,我可以获取想要的 file.txt,但是当我尝试使用 python 和请求检索文件时,它不起作用:

>>> import requests
>>> url = "https://website.com/chill & relax/folder/file.txt?a=1&b=2"
>>> requests.get(url)

Traceback (most recent call last):
[...]
urllib3.exceptions.NewConnectionError: <urllib3.connection.VerifiedHTTPSConnection object at 0x00982B70>: 
Failed to establish a new connection: [WinError 10060] [...]

为什么 Firefox 可以请求文件而不是 requests?如何仅替换 URL 路径部分中的空格和“&”符号?

编辑:我现在相信请求实际上可以使用包含空格的 URL 执行请求。我认为这个问题与我的代理有关,Firefox 可以使用我的代理,但是在 PyCharm 中执行的请求命令被我的代理停止。

【问题讨论】:

标签: python url python-requests


【解决方案1】:

对于路径编码,您可以使用:

from requests.utils import requote_uri
url = requote_uri("https://website.com/chill & relax/folder/file.txt?a=1&b=2")

但是即使在浏览器中,链接也对我不起作用。链接真的有效吗?

【讨论】:

  • 该链接是一个虚拟示例,它不能正常工作,我将编辑我的原始消息来解释这一点。感谢 requote_uri,我会调查的。
【解决方案2】:

只需对您的路径进行 URL 编码,然后附加参数。

import urllib.parse
url = urllib.parse.quote("https://website.com/chill & relax/folder/file.txt")
url += "?a=1&b=2"
r = requests.get(url)

【讨论】:

  • 这会将url 设置为'https%3A//website.com/chill%20%26%20relax/folder/file.txt?a=1&amp;b=2',这也是行不通的。
  • 你能发布更多的回溯吗?我认为该错误可能会在那里得到更多解释,因为文档说requests auto-escapes spaces
  • urllib.parse.quote 编码的字符太多。另外,如何删除 URL 的参数部分?我通过从文件中读取数据来创建我的 URL,我没有手动设置路径和参数
  • @JammyDodger 我不是 OP。显然'https%3A//website.com/chill%20%26%20relax/folder/file.txt?a=1&amp;b=2' 不是有效的 URL。
猜你喜欢
  • 1970-01-01
  • 2023-03-12
  • 1970-01-01
  • 2020-09-20
  • 2011-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多