Я пытаюсь разобрать JSON в скрипте страницы html.
import requests
from bs4 import BeautifulSoup
import json
headers = {
"User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36 OPR/64.0.3417.47",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"Accept-Language": "fr-FR,en;q=0.5",
"Accept-Encoding": "gzip, deflate",
"Connection": "keep-alive",
"Cache-Control": "max-age=0",
"Upgrade-Insecure-Requests": "1",
}
proxy = "http://stack:overflow@45.135.149.142:14758"
url = "https://www.seloger.com/list.htm?projects=2%2C5&types=2%2C1&natures=1%2C2%2C4&places=%5B%7Bci%3A60088%7D%5D&enterprise=0&qsVersion=1.0"
r = requests.get(url, proxies={"http": proxy, "https": proxy}, headers=headers)
soup = BeautifulSoup(r.text, 'html.parser')
for script in soup.find_all('script'):
if "initialData" in script.text:
data = script.text.split('JSON.parse("', 1)[1].split('");window["tags"]', 1)[0]
json_data = json.loads(data)
И эта ошибка возвращается:
json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)
Проблема в том, что \ u0022 не преобразуется в кавычку ", которая вызывает ошибку декодера json.
Кроме того, всякий раз, когда я печатаю код сценария, вместо u выводится \ u0022". Я уже пробовал кодирование и декодирование в нескольких форматах, прежде чем передать его json .loads, но ничего не получилось.
Эта проблема возникает только тогда, когда код анализируется непосредственно из ответа на запрос. Я не могу повторить проблему. Этот код работает должным образом:
snippet = '''<script>
window["initialData"] = JSON.parse("{\u0022foo\u0022:\u0022bar\u0022,\u0022xxx\u0022:\u0022xyz\u0022}")
</script>
'''
soup = BeautifulSoup(snippet, 'html.parser')
for script in soup.find_all('script'):
data = script.text.split('JSON.parse("')[1].split('")')[0]
json_data = json.loads(data)
print(json_data)
# output : {'foo': 'bar', 'xxx': 'xyz'}
Как я могу это исправить?