请求 - Python命令行行为与运行脚本时的行为不同

时间:2016-04-29 17:43:07

标签: python python-requests

我正在尝试编写一个脚本,将我提供的数据输入到我提供的URL中的Web表单中。

首先,我只是通过获取页​​面的html并将其作为文本文件输出来测试它。 (我正在使用Windows,因此.txt。)

import sys
import requests

sys.stdout = open('html.txt', 'a')

content = requests.get('http://www.york.ac.uk/teaching/cws/wws/webpage1.html')

content.text

当我在python命令行(>>>)上执行此操作(即最后两行)时,我得到了我期望的结果。当我在此脚本中执行此操作并从正常命令行运行它时,生成的html.txt为空。如果我添加print(content),则html.txt仅包含:< Response [200]&gt ;.

任何人都可以澄清这里发生了什么吗?另外,你可能会说,我是初学者,我不能在我的生活中找到一个初级水平的教程,解释如何使用请求(或urllib [2]或selenium或其他)发送数据到网页并检索结果。谢谢!

2 个答案:

答案 0 :(得分:2)

你想:

import sys
import requests

result = requests.get('http://www.york.ac.uk/teaching/cws/wws/webpage1.html')
if result.status_code == requests.codes.ok:
    with open('html.txt', 'a') as sys.stdout:
        print result.content

请求返回类型为request.Response的实例。当您尝试打印时,调用了__repr__方法,如下所示:

def __repr__(self):
    return '<Response [%s]>' % (self.status_code)

这就是<Response [200]>的来源。

requests.Reponse有一个content属性,该属性是包含HTML的str(或Python的bytes)实例。

text属性是unicode类型,可能是您想要的,也可能不是。您在评论中提到,当您尝试将其写入文件时,您看到UnicodeDecodeError。我能够用print result.content替换上面的print result.text,但我没有收到错误。

如果您需要帮助解决unicode问题,建议您阅读unicode presentation。它解释了为什么以及何时解码和编码unicode

答案 1 :(得分:2)

交互式解释器回应每个不产生None的表达式的结果。这在常规脚本中不会发生。

使用print显式回显值:

print response.content

我在这里使用未解码的版本,因为您将stdout重定向到没有其他编码信息的文件。

您最好直接将输出写入文件:

with open('html.txt', 'ab') as outputfile:
    outputfile.write(response.content)

这会将未解码的响应主体直接写入文件。