дозапись в json данных с отступами при помощи python
как при сохранении данных в json файл, сохранить форматирование:
from bs4 import BeautifulSoup
import json
html_block = str('''<div class="microformat"><script type="application/ld+json">[{"@context":"http://schema.org","@type":"MusicEvent","name":"Artist"}]</script></div>''')
soup = BeautifulSoup(html_block, "html.parser")
js = soup.find("script", type="application/ld+json").text
try:
data_json = json.load(open("data.json"))
except:
data_json = []
data_json.append(js)
with open("data.json", mode="w") as json_file:
json.dump((data_json), json_file, indent=4, ensure_ascii=False)
После двух запусков скрипта.
Ожидание:
[
{
"@context": "http://schema.org",
"@type": "MusicEvent",
"name": "Artist"
},
{
"@context": "http://schema.org",
"@type": "MusicEvent",
"name": "Artist"
}
]
Реальность:
[
"[{\"@context\":\"http://schema.org\",\"@type\":\"MusicEvent\",\"name\":\"Artist\"}]",
"[{\"@context\":\"http://schema.org\",\"@type\":\"MusicEvent\",\"name\":\"Artist\"}]"
]
Ответы (1 шт):
Автор решения: Roman Konoval
→ Ссылка
У вас в переменной js хранится строка. Вы ее добавляете в список, и вас получается список с элементами-строками. Это вы и наблюдаете.
Нужно строку преобразовать в объекты:
js_str = soup.find("script", type="application/ld+json").text
js = json.loads(js_str)
try:
data = json.load(open("data.json"))
except:
data = []
data.extend(js) # так как у вас в js_str строка уже со списком,
# то в js будет список элементов, и добавлять из него
# эелементы в результат нужно с помощью extend
with open("data.json", mode="w") as json_file:
json.dump(data, json_file, indent=4, ensure_ascii=False)