Как разобрать JavaScript-код в HTML-код источника в Python? - PullRequest
0 голосов
/ 04 мая 2019

Я пытаюсь очистить некоторые данные внутри тега JavaScript в источнике HTML.

Ситуация: я могу добраться до соответствующего тега <script></script>. Но внутри этого тега есть большая строка, которую нужно преобразовать, а затем проанализировать, чтобы я мог получить точные данные, которые мне нужны.

Проблема в том, что я не знаю, как это сделать, и не могу найти четкого и удовлетворительного ответа.

Вот код:

Моя цель - получить эти данные: "xe7fd4c285496ab91", который является идентификационным номером контента, также называемый "contentId".

import requests
import bs4
import re

url = 'https://www.khanacademy.org/computing/computer-programming/programming/drawing-basics/pt/making-drawings-with-code'
response = requests.get(url)
soup = bs4.BeautifulSoup(response.text,'html.parser') # by the way I am not sure if this is the right way to parse the link

item = soup.find(string=re.compile('contentId')) # with this line I can get directly to the exact javascript tag that I need

print(item) # but as you can see, it's a pretty big string, and I need to parse it to get the desired data. But you can find that the desired data "xe7fd4c285496ab91" is in it.

Я пытался использовать json.parse(), но он не работает:

import json
jsonparsed=json.parse(item)

Получите эту ошибку:

AttributeError: 'NavigableString' object has no attribute 'json'

Мой вопрос: Как я могу получить нужные данные? Есть ли функция для преобразования строки в JavaScript, чтобы я мог ее проанализировать? Или способ конвертировать эту строку в файл JSON?

(Имейте в виду, что я сделаю это для нескольких ссылок с похожим HTML / JavaScript).

1 Ответ

1 голос
/ 04 мая 2019

Вы можете просто использовать регулярное выражение только для текста без поиска сценария

import re
import requests

r = requests.get('https://www.khanacademy.org/computing/computer-programming/programming/drawing-basics/pt/making-drawings-with-code')
p = re.compile(r'contentId":"((?:(?!").)*)')  
i = p.findall(r.text)[0]
print(i)

Регулярное выражение

enter image description here

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