【问题标题】:Python error when adding variable with backslash character to URL string将带有反斜杠字符的变量添加到 URL 字符串时出现 Python 错误
【发布时间】:2017-11-29 09:50:42
【问题描述】:

我正在尝试从分配会话 cookie 并生成包含我需要附加到 URL 以获取数据的 URL 的碎屑代码的 HTML 的网站中抓取一些数据。当 crumb 变量包含反斜杠时,我遇到了问题(HTTP 401 Unauthorized)......由于 crumb 是一个变量,我无法弄清楚如何将 r' 添加到开头。我尝试将 .encode('string-escape') 和 .replace('\\','\\\\') 添加到 crumb 变量中,但我无法让它工作。

我的代码在 python 2.7 中看起来像这样:

cj = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))    
opener.open('http://www.sample.com')

#Some code here that looks for crumb code in HTML

crumb = 'abc\xyz'

#This line fails when crumb contains a backslash
opener.open('http://www.sample.com/data=' + crumb)

cj.clear()

有谁知道在尝试打开包含反斜杠的 URL 字符串时如何避免 401 错误?

另外,如果我循环遍历多个面包屑,是否每次都需要清除会话 cookie?

更新:事实证明,反斜杠是从 HTML 中的 \u002F 引入的。我相信如果在将字符串添加到 URL 之前将它们转换为正斜杠,它会起作用。如何将字符串中的 \u002F 转换为 /?

【问题讨论】:

  • crumb = r'abc\xyz'足够了吗?
  • 认为您需要对斜线进行 urlencode。
  • @Nuageux,我不能,因为我不知道字符串是什么(只是使用占位符进行演示)。
  • @idjaw,我确实尝试过 urlencode,所以它会引入 %5C,但它仍然给我 401。

标签: python url cookies urllib2 backslash


【解决方案1】:

因为你不能使用crumb = r'abc\xyz'。我相信str.encode('string-escape') 功能可能会有所帮助。试试:

crumb = 'abc\xyz'
crumb.encode('string-escape')

【讨论】:

  • 我很抱歉,因为我的问题表明我尝试了“字符串编码”。事实上,我确实尝试了“string-escape”,但收到了同样的错误。在解释器中,我可以打印正在填充的内容,它显示为“sample.com/data=abc”\xyz,反斜杠之前的所有内容都被识别为 URL,但其余部分没有作为 URL 的一部分突出显示。当我编码并将反斜杠转换为 %5C 时,整个字符串突出显示为 URL,但我仍然收到 401 错误。
【解决方案2】:

这里的问题是“\”是python中的转义字符,因此要使其成为不包含任何特殊字符的原始字符串,您必须在字符串之前添加一个“r”。你的代码应该是这样的

cj = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))    
opener.open('http://www.sample.com')

#I'm adding a 'r' before the string

crumb = r'abc\xyz'

opener.open('http://www.sample.com/data=' + crumb)

cj.clear()

编辑:您可能必须对“\”进行编码才能正确格式化 url 请求。所以“\”将是“%5C”。

【讨论】:

  • 我应该添加更多细节,但该变量是通过从第一个网站搜索 HTML 来分​​配的,所以我无法将 r' 添加到它。不幸的是,Urlencode to %5C 给了我同样的错误。
  • @InsuQ 哦,好吧,我明白了,恐怕我不能帮助你。不包含反斜杠时是否有效?
  • 是的,当没有反斜杠时,它可以工作。其他字符,例如点 (.) 也可以通过。
  • @InsuQ 我发现奇怪的是它返回了 401(未经授权)我真的看不出有什么问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-23
  • 1970-01-01
  • 1970-01-01
  • 2013-05-29
  • 1970-01-01
  • 2022-08-07
  • 1970-01-01
相关资源
最近更新 更多