Загрузить файл JSON в словарь, а не строку или список - PullRequest
0 голосов
/ 21 октября 2018

Я создал файл JSON после очистки данных в сети со следующим упрощенным кодом:

for item in range(items_to_scrape)
    az_text = []
    for n in range(first_web_page, last_web_page):
            reviews_html = requests.get(page_link)
            tree = fromstring(reviews_html.text)
            page_link = base_url + str(n)
            review_text_tags = tree.xpath(xpath_1)
            for r_text in review_text_tags:
                review_text = r_text.text
                az_text.append(review_text)
    az_reviews = {}
    az_reviews[item] = az_text
    with open('data.json', 'w') as outfile:
        json.dump(az_reviews , outfile)

Возможно, существует лучший способ создать файл JSON с первым ключом, равным номеру элемента ивторой ключ, равный списку отзывов для этого элемента, однако в настоящее время я застрял при открытии файла JSON, чтобы увидеть, что элементы уже были очищены.

Структура файла JSON выглядит следующим образом:

{
  "asin": "0439785960",
  "reviews": [
    "Don’t miss this one!",
    "Came in great condition, one of my favorites in the HP series!",
    "Don’t know how these books are so good and I’ve never read them until now. Whether you’ve watched the movies or not, read these books"
  ]
}

Неудачная попытка, которая, похоже, ближе к решению, следующая:

import json
from pprint import pprint

json_data = open('data.json', 'r').read()
json1_file = json.loads(json_data)
print(type(json1_file))
print(json1_file["asin"])

Возвращает строку, которая точно копирует результат функции print (), которую я использовал во время очисткипроцесс, чтобы проверить, как должен выглядеть файл JSON, но я не могу получить доступ к asins или обзорам, используя json1_file["asin"] или json1_file["reviews"], так как прочитанный файл является строкой, а не словарем.

TypeError: string indices must be integers

Используя функцию json.load(), я все еще печатаю правильное содержимое, но не могу понять, как получить доступ к словарному объекту из JSOФайл N для перебора ключей и значений.

Следующий код печатает содержимое файла, но выдает ошибку (AttributeError: '_io.TextIOWrapper' object has no attribute 'items'), когда я пытаюсь перебрать ключи и значения:

with open('data.json', 'r') as content:
    print(json.load(content))
    for key, value in content.items():
        print(key, value)

Что не так с приведенным выше кодом и что нужно настроить, чтобы загрузить файл в словарь?

1 Ответ

0 голосов
/ 22 октября 2018

строковые индексы должны быть целыми числами

Вы записываете данные в виде строки, а не словаря.Удалите дампы и только дамп

with open('data.json', 'w') as outfile:
    json.dump(az_reviews, outfile, indent=2, ensure_ascii=False) 

что нужно отрегулировать для загрузки файла в словарь?

После анализа объекта JSON ине строка, то ничего, кроме, возможно, не использования чтения, затем загрузки и, скорее, только json.load


Другая проблема, похоже, заключается в том, что вы перезаписываете файл на каждой итерации цикла

Вместо этого вы, вероятно, захотите открыть один файл, затем выполнить цикл и впоследствии записать в него

data = {} 
for item in range(items_to_scrape):
    pass # add to data
# put all data in one file 
with open('data.json', 'w') as f:
    json.dump(data, f)

В этом сценарии я предлагаю вам сохранить asin в качестве ключа, а отзывы в качестве значений

asin = "123456"  # some scraped value 
data[asin] = reviews 

Или напишите уникальный файл для каждого скрапа, который затем необходимо зациклить, чтобы прочитать их все.

for item in range(items_to_scrape):
    data = {} 
    # add to data
    with open('data{}.json'.format(item), 'w') as f: 
        json.dump(data, f)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...