向URL字符串添加带有反斜杠字符的变量时出现Python错误

向URL字符串添加带有反斜杠字符的变量时出现Python错误,python,url,cookies,urllib2,backslash,Python,Url,Cookies,Urllib2,Backslash,我正试图从一个网站上抓取一些数据,该网站分配了一个会话cookie,并生成HTML,其中包含一个我需要附加到URL以获取数据的碎屑代码。当crump变量包含反斜杠时,我遇到了问题(HTTP 401未经授权)。。。因为crump是一个变量,所以我不知道如何将r'添加到开头。我已经尝试将.encode('string-escape')和.replace('\\','\\\\')添加到crump变量中,但无法使其工作 我在python 2.7中的代码如下所示: cj = cookielib.Cooki

我正试图从一个网站上抓取一些数据,该网站分配了一个会话cookie,并生成HTML,其中包含一个我需要附加到URL以获取数据的碎屑代码。当crump变量包含反斜杠时,我遇到了问题(HTTP 401未经授权)。。。因为crump是一个变量,所以我不知道如何将r'添加到开头。我已经尝试将.encode('string-escape')和.replace('\\','\\\\')添加到crump变量中,但无法使其工作

我在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转换为/?

这里的问题是“\”在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”。

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

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

crumb=r'abc\xyz'
足够了吗?我想你需要对斜杠进行URL编码。可能是@Nuageux的重复,我不能,因为我不知道字符串将是什么(只是用作演示的占位符)。@idjaw,我尝试过URL编码,所以它引入了%5C,但它仍然给我401。我应该添加更多细节,但是这个变量是通过搜索第一个网站的HTML来分配的,所以我无法将r'添加到其中。不幸的是,Urlencode到%5C给了我同样的错误。@InsuQ哦,好的,我明白了,恐怕我那时帮不了你。当它不包含反斜杠时,它能工作吗?是的,当没有反斜杠时,它能工作。其他字符,如点(.)也可以通过。@INSAQ我发现奇怪的是它返回了一个401(未经授权),我真的看不出问题出在哪里。我道歉,因为我的问题说我尝试了“字符串编码”。事实上,我尝试了“字符串转义”,但收到了相同的错误。在解释器中,我可以打印正在填充的内容,它显示为“”\xyz,在反斜杠被识别为URL之前,所有内容都显示为“”\xyz,但它的其余部分没有作为URL的一部分突出显示。当我编码并将反斜杠转换为%5C时,整个字符串将突出显示为URL,但我仍然得到401错误。