Python requests.get 请求 URL 存在但显示 404 错误

5

我正在尝试打开这个网址:

http://www.leboncoin.fr/montres_bijoux/671762293.htm

import requests
s = requests.Session()
s.headers['User-Agent'] = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/34.0.1847.116 Chrome/34.0.1847.116 Safari/537.36'
s.headers['Host'] = 'www.leboncoin.fr'
url = 'http://www.leboncoin.fr/montres_bijoux/671762293.htm'
r = s.get(url)
print r.text

当我运行这个脚本时,我的终端显示了这个错误。
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>404 Not Found</title>
</head><body>
<h1>Not Found</h1>
<p>The requested URL /montres_bijoux/671762293.htm  was not found on this server.</p>
</body></html>

虽然我可以在浏览器中打开相同的URL并查看内容,但为什么无法在其他地方打开呢?

可能出现了什么问题?


你能展示一下你在哪里设置了url的值吗?你想确保它是完整的URL(例如http://domain.com/asdasd),而不仅仅是路径部分。 - okoboko
实际上,我在IPython shell中做了同样的事情,它也对我起作用了,但是当我在文件中执行相同的代码时,它显示了上述错误? - user3810188
你所说的“在文件中执行相同的代码”是什么意思?你是如何运行它的,运行它的位置在哪里? - Padraic Cunningham
我创建了一个新文件 test.py,并将相同的代码放入其中,然后执行该文件作为 python test.py - user3810188
没关系,不用谢。 - Padraic Cunningham
显示剩余11条评论
1个回答

15

即使没有等待你的测试,我相信我已经知道你的错误是什么了。

我手动将此URL放入函数调用中,它可以正常工作,但是如果我从文件中读取该文件并直接使用该URL调用函数,则会报错。在读取文件时,我进行了3-4次检查,URL从文件中完美地传递,即使我试图在被调用的函数内打印该URL,我也能收到该URL。仍然不知道发生了什么?

很可能您正在使用像for line in file:file.readline或保留换行符的其他函数读取URL。所以,实际上你最终得到的不是这个:

url = 'http://www.leboncoin.fr/montres_bijoux/671762293.htm'

...但是这个:

url = 'http://www.leboncoin.fr/montres_bijoux/671762293.htm\n'

后者将被requests转义为一个完全不存在的资源的有效URL,因此出现了404错误。

检查的最佳方法是使用print repr(url)而不是print(url)。这也会发现其他可能的问题,例如嵌入的不可打印字符。它不能找到所有东西,比如看起来像.但实际上不是的Unicode字符,但这是一个好的第一次测试。 (如果这不起作用,请复制并粘贴输出中的引号和所有内容到测试脚本中进行第二次测试。)

如果这是问题,解决方案很简单:

url = url.rstrip()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接