将变量从命令行解析为url

时间:2016-10-26 03:34:39

标签: python parsing download urllib argparse

我有一个名为dlimage的python脚本。我想在终端中键入一个变量,如$ python dlimage.py 1 2,并且1 and 2对应于download_web_image中的url,成为http://www.example.com/1/2.jpg并下载图像。我该怎么做呢?

import urllib.request
import argparse

def download_web_image(url):
    urllib.request.urlretrieve(url)

parser = argparse.ArgumentParser()
parser.add_argument("num1", "num2")
args = parser.parse_args()

download_web_image("http://www.example.com/"num1"/"num2".jpg")

编辑2: 我终于开始工作了。谢谢大家的帮助! 有效的代码:

import urllib
import argparse

def download_web_image(url):
    IMAGE = url.rsplit('/',1)[1]
    urllib.urlretrieve(url, IMAGE)

parser = argparse.ArgumentParser()
parser.add_argument("num1")
parser.add_argument("num2")
args = parser.parse_args()

download_web_image("https://www.example.com/{num1}/{num2}.jpg".format(num1=args.num1, num2=args.num2))

5 个答案:

答案 0 :(得分:2)

更改此

parser.add_argument("num1, "num2")

parser.add_argument("num1", "num2")

答案 1 :(得分:2)

当我尝试部分代码时,出现错误:

In [1663]: parser = argparse.ArgumentParser()
In [1664]: parser.add_argument("num1", "num2")
....
ValueError: invalid option string 'num1': must start with a character '-'

add_argument方法的参数是错误的。

你应该使用的是:

parser = argparse.ArgumentParser()
parser.add_argument("num1")
parser.add_argument("num2")

在这种情况下,help将如下所示:

In [1668]: parser.print_help()
usage: ipython3 [-h] num1 num2

positional arguments:
  num1
  num2

optional arguments:
  -h, --help  show this help message and exit

并测试相当于myprog 1 2

的输入
In [1669]: args = parser.parse_args(['1','2'])
In [1670]: args
Out[1670]: Namespace(num1='1', num2='2')
In [1671]: args.num1
Out[1671]: '1'
In [1672]: args.num2
Out[1672]: '2'

现在我可以使用以下内容格式化网址:

In [1675]: "https://www.example.com/{}/{}.jpg".format(args.num1, args.num2)
Out[1675]: 'https://www.example.com/1/2.jpg'

因此您的代码存在两个问题:

每个参数num1num2必须在单独的add_argument语句中定义。阅读文档以查看您可以添加到该语句的其他内容,例如help。您试图在一个语句中定义2个参数,并收到错误。

其次,您需要使用正确的格式。我添加了{}{0}{num1}样式也有效)。或旧的Py2风格:

"https://www.example.com/%s/%s.jpg"%(args.num1, args.num2)

答案 2 :(得分:1)

为此我会使用格式:

download_web_image("http://www.example.com/{num1}/{num2}.jpg".format(num1=args.num1, num2 = args.num2))

以下是一个例子:

num1 = 5
num2 = 6
"http://www.example.com/{num1}/{num2}.jpg".format(num1 = num1, num2 = num2)

output:
'http://www.example.com/5/6.jpg'

格式可以很容易地将定义的参数插入到字符串中。

答案 3 :(得分:1)

假设您正在使用python3,我尝试制作一些简单且接近您最初尝试的方法。希望这会有所帮助。

import urllib.request
import sys
def download_web_image(url):
    urllib.request.urlretrieve(url)

download_web_image("http://www.example.com/{0}/{1}.jpg".format(sys.argv[1], sys.argv[2]))

答案 4 :(得分:0)

我想你想要传递N个参数,以便生成一个我会这样做的URL:

import sys
args = sys.argv[1:]
baseURL = "http://www.example.com"
url = baseURL + "/" + "/".join(args)
print url

INPUT:

$ python dlimage.py 1 2 3.jpg

输出:

http://www.example.com/1/2/3.jpg

对于下载,您可以尝试this answer,或者在URL上读取数据并将其写为名为最后一个参数的文件:

import urllib2
urlResponse = urllib2.urlopen(url)
urlData = urlResponse.read()

outFile = open(args[-1], 'w')
outFile.write(urlData)
outFile.close()

我在工作代理后面,当我下载文件时收到错误,可能会在今天晚些时候在家里更新我的答案。