找回密码
 立即注册

扫一扫,访问微社区

QQ登录

只需一步,快速开始

查看: 1818|回复: 0

[求助] python3实现火车票查询工具遇到的问题

2

主题

2

帖子

2

积分

贫民

积分
2
oushitianxia 发表于 2019-7-11 10:57:40 | 显示全部楼层 |阅读模式
执行时报错
>python.exe tickets.py -v
Traceback (most recent call last):
  File "tickets.py", line 86, in <module>
    cli()
  File "tickets.py", line 39, in cli
    TransCollection(resp**e.json()['data'],opti**)
  File "C:\Users\beckh\PycharmProjects\untitled\venv\lib\site-packages\requests\models.py", line 897, in json
    return complexjson.loads(self.text, **kwargs)
  File "C:\Users\beckh\AppData\Local\Programs\Python\Python36\lib\json\__init__.py", line 354, in loads
    return _default_decoder.decode(s)
  File "C:\Users\beckh\AppData\Local\Programs\Python\Python36\lib\json\decoder.py", line 339, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "C:\Users\beckh\AppData\Local\Programs\Python\Python36\lib\json\decoder.py", line 357, in raw_decode
    raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

但是我自己print(resp**e.json()['data']) 时输出正常
{'flag': '1', 'map': {'BJP': '北京', 'BXP': '北京西', 'CSQ': '长沙', 'CWQ': '长沙南'}, 'result':   .....后面省略了


代码如下,麻烦各位大神看看是哪里出问题了。
# -*- coding:GBK -*-

"""命令行火车票查看器
Usage:
    tickets.py [-gdtkz] <from> <to> <date>
    tickets.py -v
    tickets.py -h

Opti**:
    -v          显示版本
    -h          显示帮助菜单
    -g          高铁
    -d          动车
    -t          特快
    -k          快速
    -z          直达
#Example:
#    tickets 北京 上海 2016-10-10
#    tickets -dg 成都 南京 2016-10-10
"""

from docopt import docopt
from stati** import stati**
import requests
from prettytable import PrettyTable
from colorama import init, Fore

init()

def cli():
    arguments = docopt(__doc__,version='Naval Fate 2.0')
    print(arguments)
    from_station = stati**.get(arguments['<from>'])
    to_staion = stati**.get(arguments['<to>'])
    date = arguments['<date>']
    url='https://kyfw.12306.cn/otn/leftTicket/query?leftTicketDTO.train_date={}&leftTicketDTO.from_station={}&leftTicketDTO.to_station={}&purpose_codes=ADULT'.format(date, from_station, to_staion)
    resp**e = requests.get(url, verify=False)
    opti** = ''.join([key for key, value in arguments.items() if value is True])
    TransCollection(resp**e.json()['data'], opti**).pretty_print()

class TransCollection:
    header = '车次 车站 时间 历时 一等座 二等座 软卧 硬卧 硬座 无座'.split()

    def __init__(self, available_trains, opti**):
        self.availavle_trains = available_trains
        self.opti** = opti**

    def _get_duration(self, train_data):
        duration = train_data.get('lishi').replace(':', '小时')+'分'
        if duration.startswith('00'):
            return duration[4:]
        if duration.startswith('0'):
            return duration[1:]
        return duration

    @property
    def trains(self):
        for train in self.availavle_trains:
            train_data = train['queryLeftNewDTO']
            train_number = train_data['station_train_code'][0].lower()   # 开头转换成小写
            if not self.opti** or train_number in self.opti**:
                train = [
                    train_data['station_train_code'],              # 车次
                    '\n'.join([Fore.GREEN+train_data['from_station_name']+Fore.RESET,    # 车站
                               Fore.RED+train_data['to_station_name']+Fore.RESET]),
                    '\n'.join([Fore.GREEN+train_data['start_time']+Fore.RESET,           # 车站
                               Fore.RED+train_data['arrive_time']+Fore.RESET]),
                    self._get_duration(train_data),                # 历时
                    train_data['zy_num'],                          # 一等座
                    train_data['ze_num'],                          # 二等座
                    train_data['rw_num'],                          # 软卧
                    train_data['yw_num'],                          # 硬卧
                    train_data['yz_num'],                          # 硬座
                    train_data['wz_num'],                          # 无座
                ]
                yield train

    def pretty_print(self):
        pt = PrettyTable()
        pt._set_field_names(self.header)
        for train in self.trains:
            pt.add_row(train)
        print(pt)

if __name__ == '__main__':
    cli()

20190711.png
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表