Записать конкретную структуру JSON в файл .json на Python - PullRequest
0 голосов
/ 20 октября 2018

У меня есть следующий код Python:

import requests
import json
from bs4 import BeautifulSoup

url = requests.get('https://www.perfectimprints.com/custom-promos/20492/Beach-Balls.html')
source = BeautifulSoup(url.text, 'html.parser')

products = source.find_all('div', class_="product_wrapper")

def get_product_details(product):
  product_name = product.find('div', class_="product_name").a.text
  sku = product.find('div', class_="product_sku").text
  product_link = product.find('div', class_="product_image_wrapper").find("a")["href"]
  src = product.find('div', class_="product_image_wrapper").find('a').find("img")["src"]
  return {
      "title": product_name,
      "link": product_link,
      "sku": sku,
      "src": src
  }

all_products = [get_product_details(product) for product in products]

with open("products.json", "w") as write_file:
  json.dump(all_products, write_file)

print("Success")

Этот код работает отлично, как написано.Проблема в том, что я хочу структуру вместо

[
  {
    "title": "12\" Beach Ball",
    "link": "/promos/PI-255-751/12-Beach-Ball.html?cid=20492",
    "sku": "  \n\t\t\t\t#PI-255-751\n\t\t\t",
    "src": "https://12f598f3b6e7e912e4cd-a182d9508ed57781ad8837d0e4f7a945.ssl.cf5.rackcdn.com/thumb/751_group.jpg"
  },
]

Я хочу, чтобы она была:

{
  "items": [
    {
      "title": "12\" Beach Ball",
      "link": "/promos/PI-255-751/12-Beach-Ball.html?cid=20492",
      "sku": "  \n\t\t\t\t#PI-255-751\n\t\t\t",
      "src": "https://12f598f3b6e7e912e4cd-a182d9508ed57781ad8837d0e4f7a945.ssl.cf5.rackcdn.com/thumb/751_group.jpg"
    },
  ]
}

Вот ссылка на то, что я работаю в Repl.it, просто чтобы выне нужно настраивать свои собственные: https://repl.it/repls/AttractiveDimpledTheory

Примечание: хотелось бы также иметь возможность удалить все \n и \t в sku s, если это возможно.

1 Ответ

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

Здесь вы выгружаете свой список all_products непосредственно в JSON:

with open("products.json", "w") as write_file:
    json.dump(all_products, write_file)

Нужный JSON просто содержит этот список в объекте.Что-то вроде

with open("products.json", "w") as write_file:
    json.dump({'items': all_products}, write_file)

должно делать то, что вы хотите.

Вообще говоря, между вашей структурой данных Python и JSON, который она генерирует, существует соотношение 1: 1.Если вы построите правильную структуру данных Python, вы получите правильный JSON.Здесь мы используем dict (который сопоставляется с объектом JSON), чтобы обернуть существующий list (который сопоставляется с массивом JSON).

Примечание: хотелось бы такжевозможность удалить все \n и \t в sku s, если это возможно.

Если вы также хотите удалить пробелы, вы можете просто использовать str.strip(), который по умолчанию удаляет пробелы:

return {
    "title": product_name,
    "link": product_link,
    "sku": sku.strip(),  # <-- here
    "src": src
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...