【问题标题】:Removing certain characters from an url string (Python3)从 url 字符串中删除某些字符(Python3)
【发布时间】:2018-11-03 15:19:35
【问题描述】:

我终于想出了如何将我的字典与数据转换成一个字符串,这给了我想要的输出。我想知道如何使这段代码更密集。有什么建议?

import urllib.parse
import urllib.request
import re

#user input
start = '19851123'
end = '19851124'
stns = [('235','240')]
var = [('TEMP')]

#format input to dict
req = {
'start':start,
'end':end,
'vars':var,
'stns':stns
}

#format dict to url strg without modifing the 'safe characters'
q = urllib.parse.urlencode(req, doseq = True, safe="()',")

#removing the 'safe characters' and turn '+' into ':'
q = re.sub("[\(',\)]", "", q)
q = re.sub("\+", ":", q)

#combine the url and query
url = 'http://projects.knmi.nl/klimatologie/daggegeven/getdata_dag.cgi?%s' % q 


#create a handel with url+query
fhand = urllib.request.urlopen(url)

#print requested data whitout header
for line in fhand:
    if not line.decode().startswith('#'):
        print(line.decode().strip())

【问题讨论】:

  • @JoeIddon 随意推荐 CR 上的 OP 帖子,但在未来,请不要使用代码审查作为关闭问题的理由。评估请求并使用太宽泛主要基于意见等原因。然后您可以向 OP 提及它可以在 Code Review 上发布(如果是) on-topic。请参阅this answer to A guide to Code Review for Stack Overflow users 中的你不应该做的事情部分
  • @SamOnela 好的,感谢您的评论。我通常不会关闭代码审查,但觉得这个问题更适合那个 SE。将来我将关闭主要基于意见,因为我同意这是一个更好的选择。

标签: python string url urllib


【解决方案1】:

通过预处理您的req 输入,您可以避免使用re

req = {
  'start': 19851123,
  'end': 19851124,
  'vars': ['TEMP'],
  'stns': ['235:240'],
}

urllib.parse.urlencode(req, doseq=True, safe=':')
# 'start=19851123&end=19851124&vars=TEMP&stns=235:240'

因此您可以将代码限制为:

from urllib.parse import urlencode
from urllib.request import urlopen


def main(parameters, url='http://projects.knmi.nl/klimatologie/daggegeven/getdata_dag.cgi'):
    query = urlencode(parameters, doseq=True, safe=':')
    with urlopen('{}?{}'.format(url, query)) as fhand:
        for line in fhand:
            if not line.startswith(b'#'):
                yield line.decode().strip()


if __name__ == '__main__':
    req = {
        'start': 19851123,
        'end': 19851124,
        'vars': ['TEMP'],
        'stns': ['235:240'],
    }
    for line in main(req):
        print(line)

但是修改用户输入感觉很麻烦,所以使用argparse 可能是有益的。从表面上看,varsstns 的长度可能不同,因此您可能会从具有特定默认案例处理的 'append' action 中受益:

import argparse
from urllib.parse import urlencode
from urllib.request import urlopen


def command_line_parser():
    parser = argparse.ArgumentParser()
    parser.add_argument('start', type=int)
    parser.add_argument('end', type=int)
    parser.add_argument('-v', '--vars', action='append')
    parser.add_argument('-s', '--stns', action='append', nargs=2, type=int)
    return parser


def parse_command_line(parser):
    args = parser.parse_args()
    if args.vars is None:
        args.vars = ['TEMP']
    if args.stns is None:
        args.stns = [(235, 240)]
    args.stns = ['{}:{}'.format(*stn) for stn in args.stns]
    return args


def main(parameters, url='http://projects.knmi.nl/klimatologie/daggegeven/getdata_dag.cgi'):
    query = urlencode(parameters, doseq=True, safe=':')
    with urlopen('{}?{}'.format(url, query)) as fhand:
        for line in fhand:
            if not line.startswith(b'#'):
                yield line.decode().strip()


if __name__ == '__main__':
    for line in main(vars(parse_command_line(command_line_parser()))):
        print(line)

用法类似于

$ python script.py -v TEMP -v TEST -s 235 240 19851123 19851124

将查询以下 URL:

http://projects.knmi.nl/klimatologie/daggegeven/getdata_dag.cgi?start=19851123&end=19851124&vars=TEMP&vars=TEST&stns=235:240

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-24
    相关资源
    最近更新 更多