如何使用curl从python中获取数据?

2024-04-25 06:53:21 发布

您现在位置:Python中文网/ 问答频道 /正文

In bash when I used

在myscript.sh在

file="/tmp/vipin/kk.txt" 
curl -L "myabcurlx=10&id-11.com" > $file

cat $file

./myscript.sh给出了下面的输出

^{pr2}$

When I tried to fetch it using python and tried below code -

在我的python.py在

command = curl + ' -L ' + 'myabcurlx=10&id-11.com'
output = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE).stdout.read().decode('ascii')
print(output)

python mypython.py抛出错误,请指出我的代码有什么问题吗。在

错误:

/bin/sh: line 1: &id=11: command not found
Wrong Parameter

Tags: inpycomidoutputsh错误stdout
2条回答
import subprocess

fileName="/tmp/vipin/kk.txt"

with open(fileName,"w") as f:
  subprocess.read(["curl","-L","myabcurlx=10&id-11.com"],stdout=f)

print(fileName)

推荐方法:

command = curl + ' -L ' + 'myabcurlx=10&id-11.com'

打印出这个字符串是什么,或者想想看。假设curl是字符串'curl''/usr/bin/curl'或其他内容,则可以得到:

^{pr2}$

显然这和你在shell上输入的东西不一样。最重要的是,最后一个参数没有被引用,它中间有一个&,这意味着您实际要求它做的是在后台运行curl,然后运行其他一些不存在的程序,就像您这样做了一样:

curl -L myabcurlx=10 &
id-11.com

显然,您可以在字符串中手动包含引号:

command = curl + ' -L ' + '"myabcurlx=10&id-11.com"'

…但是,如果字符串是变量而不是源代码中的文本,则这将不起作用,尤其是如果该变量中可能包含引号字符。在

shlex模块有助于正确引用内容。在

但是最简单的事情就是不要试图在一开始就构建一个命令行。您在这里没有使用任何shell特性,那么为什么还要添加额外的麻烦、性能成本、shell妨碍输出和重新编码的问题,以及可能的安全问题而毫无益处呢?在

使参数成为列表而不是字符串:

command = [curl, '-L', 'myabcurlx=10&id-11.com']

…把shell=True关了

而且它很管用。不需要获得空格和引号和转义符。在

好吧,它仍然不能工作,因为Popen不返回输出,它是Popen对象的构造函数。但这是一个完全独立的问题,如果你阅读文档,应该很容易解决。在

但是对于这种情况,更好的解决方案是使用Python绑定libcurl,而不是调用命令行工具。或者,更好的是,因为您一开始没有使用curl的任何复杂特性,所以只需使用requests来发出相同的请求。不管是哪种方式,都可以将响应对象作为Python对象获得,该对象具有诸如text和{}和{}等有用属性,除非将其输出解析为一个巨大的字符串,否则无法从命令行工具中获得这些属性。在

相关问题 更多 >