Извлеките JSON из тега HTML Script с BeautifulSoup в Python - PullRequest
0 голосов
/ 05 марта 2019

У меня есть следующий HTML, и что я должен сделать, чтобы извлечь JSON из переменной: window.__INITIAL_STATE__

<!DOCTYPE doctype html>

<html lang="en">
<script>
                  window.sessConf = "-2912474957111138742";
                  /* <sl:translate_json> */
                  window.__INITIAL_STATE__ = { /* Target JSON here with 12 million characters */};
                  /* </sl:translate_json> */
                </script>
</html>

1 Ответ

0 голосов
/ 05 марта 2019

Вы можете использовать следующий код Python для извлечения кода JavaScript.

soup = BeautifulSoup(html)
s=soup.find('script')
js = 'window = {};\n'+s.text.strip()+';\nprocess.stdout.write(JSON.stringify(window.__INITIAL_STATE__));'
with open('temp.js','w') as f:
    f.write(js)

Код JS будет записан в файл "temp.js".Затем вы можете вызвать node для выполнения файла JS.

from subprocess import check_output
window_init_state = check_output(['node','temp.js'])

Переменная python window_init_state содержит строку JSON объекта JS window.__INITIAL_STATE__, которую вы можете проанализировать в python с помощью JSONDecoder.

Пример

from subprocess import check_output
import json, bs4
html='''<!DOCTYPE doctype html>

<html lang="en">
<script> window.sessConf = "-2912474957111138742";
                  /* <sl:translate_json> */
                  window.__INITIAL_STATE__ = { 'Hello':'World'};
                  /* </sl:translate_json> */
                </script>
</html>'''
soup = bs4.BeautifulSoup(html)
with open('temp.js','w') as f:
    f.write('window = {};\n'+
            soup.find('script').text.strip()+
            ';\nprocess.stdout.write(JSON.stringify(window.__INITIAL_STATE__));')
window_init_state = check_output(['node','temp.js'])
print(json.loads(window_init_state))

Вывод:

{'Hello': 'World'}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...