Записать конкретную структуру JSON в файл .json на Python

1

У меня есть следующий код 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 если это возможно.

Теги:
python-3.x
beautifulsoup

1 ответ

1
Лучший ответ

Здесь вы all_products свой список 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)

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

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

Сторона примечания: Хотелось бы также иметь возможность удалить все \n и \t в sku если это возможно.

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

return {
    "title": product_name,
    "link": product_link,
    "sku": sku.strip(),  # <-- here
    "src": src
}
  • 0
    Я серьезно усложнил это. Спасибо вам большое!
  • 0
    Спасибо @Chris. Мне нужно было подождать 2 минуты. Еще один вопрос по поводу функции .string() . Что за раздевание, когда я не хочу лишать все пробелы. Например: у меня есть что-то похожее, чтобы получить название категории, например, Beach Balls но данные, которые я получил от python, это \n\t\t\t\t\t\tBeach Balls . Как вы можете себе представить, я хочу сохранить интервал там.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню