Загрузите строку словаря HTTP-заголовка в JSON и проанализируйте ее - PullRequest
0 голосов
/ 10 мая 2019

Этот HTTP-заголовок хранится в виде строки.Я хочу загрузить его в формате JSON, чтобы иметь возможность:

  1. Проверить, существует ли заголовок или нет.

  2. Если заголовок не существует, мне нужно напечатать "no-header"

  3. Если он существует, мне нужно проверить существование исодержание некоторых выбранных директив.Например, если найден 'Strict-Transport-Security', мне нужно проверить, есть ли у него директива max-age.И что max-age это 1111.

Как это сделать?Моя первоначальная попытка:

import json


mystring="{'Server': 'nginx', 'Date': 'Fri, 19 Apr 2019 05:46:00 GMT', 'Content-Type': 'text/html; charset=cp1251', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'Content-Encoding': 'gzip', 'Vary': 'Accept-Encoding', 'Strict-Transport-Security': 'max-age=31536000; includeSubDomains; preload'}"
d = json.loads(mystring)

print(d['Strict-Transport-Security'])

Я получил эту ошибку:

Traceback (most recent call last):   File "test.py", line 5, in
<module>
    d = json.loads(mystring)
   File "/usr/lib/python2.7/json/__init__.py", line 339, in loads
    return _default_decoder.decode(s)
   File "/usr/lib/python2.7/json/decoder.py", line 364, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
   File "/usr/lib/python2.7/json/decoder.py", line 380, in raw_decode
    obj, end = self.scan_once(s, idx)
 ValueError: Expecting property name: line 1 column 2 (char 1)

Мне нужно загрузить этот формат строки (похоже на словарь) и разобрать его в:

  1. проверить наличие имени заголовка.

  2. проверить его содержимое по некоторым определенным критериям, таким как содержит, не содержит и т. Д.

Ответы [ 2 ]

1 голос
/ 10 мая 2019

json использует двойные кавычки вместо одинарных кавычек, поэтому вы можете заменить их:

mystring="{'Server': 'nginx', 'Date': 'Fri, 19 Apr 2019 05:46:00 GMT', 'Content-Type': 'text/html; charset=cp1251', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'Content-Encoding': 'gzip', 'Vary': 'Accept-Encoding', 'Strict-Transport-Security': 'max-age=31536000; includeSubDomains; preload'}"
mystring = mystring.replace("'", '"')
>>> print(json.loads(mystring))
{'Transfer-Encoding': 'chunked', 'Vary': 'Accept-Encoding', 'Strict-Transport-Security': 'max-age=31536000; includeSubDomains; preload', 'Content-Encoding': 'gzip', 'Content-Type': 'text/html; charset=cp1251', 'Server': 'nginx', 'Connection': 'keep-alive', 'Date': 'Fri, 19 Apr 2019 05:46:00 GMT'}

Или вы можете использовать ast.literal_eval:

import ast

d = ast.literal_eval(mystring)
>>> print(d['Date'])
Fri, 19 Apr 2019 05:46:00 GMT
0 голосов
/ 10 мая 2019
mystring="{'Server': 'nginx', 'Date': 'Fri, 19 Apr 2019 05:46:00 GMT', 'Content-Type': 'text/html; charset=cp1251', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'Content-Encoding': 'gzip', 'Vary': 'Accept-Encoding', 'Strict-Transport-Security': 'max-age=31536000; includeSubDomains; preload'}"

d = eval(mystring)

print(d['Strict-Transport-Security'])

Функция eval() возвращает буквенную оценку Python строки. Так что возвращает словарь. Остальная часть вашего кода должна работать.

...