Python BeautifulSoup, как извлечь результат var из элемента javascript?
Я новичок в Python, и я пытался использовать BeautifulSoup для извлечения одной конкретной строки данных из переменной, определенной в элементе скрипта.
Код:
import requests
from bs4 import BeautifulSoup
import esprima
#----------------some comment'
URL = 'https://downdetector.com/status/facebook/'
browser = {'user-agent': 'my agent'}
#--------------some comment:
page = requests.get(URL, headers=browser)
soup = BeautifulSoup(page.content, 'html.parser')
#---------------some comment:
chart = soup.find("div",{"class":"popover-container justify-content-center p-relative"}).script.get_text()
print(chart)
ВЫХОД:
var data = {
status: 'success',
baseline: 29,
communicate: null,
company: 'Facebook',
max: 66,
series: [
{ x: '2020-05-30T13:22:28.168484-04:00', y: 25 },
{ x: '2020-05-30T13:37:28.168484-04:00', y: 27 },
.....
{ x: '2020-05-31T13:07:28.168484-04:00', y: 30 },
]
}
$(function () {
chartThis(data, 'holder', 'line')
});
if (data.communicate && $('#dd-communicate').length) {
$('#dd-communicate').html('<div class="border text-left d-inline-block p-2"><i class="fa" aria-hidden="true" style="color: red; width:16px; height:12px; background:url(https://cdn2.downdetector.com/d328eb8cbe4e164/images/v2/message.svg) no-repeat"></i>'
+'<span class="d-inline-block px-1">'+ data.company+' • ' + moment.utc(data.communicate.created_at).fromNow()
+ '</span><p class="font-weight-bold my-0">'+ data.communicate.message + '</p></div>')
}
Знаете ли вы простой способ извлечь максимальное значение из приведенного выше результата var?
Я пробовал использовать esprima, но все равно не повезло, так как обнаружил ошибку:
Traceback (последний вызов последним): файл "c: /test.py, строка 31, в if token["type"] == "Identifier"и token["value"] == "max": TypeError: 'BufferEntry'объект не подлежит подписке
Мой код с esprima выглядел так:
import requests
from bs4 import BeautifulSoup
import esprima
#----------------some comment'
URL = 'https://downdetector.com/status/facebook/'
browser = {'user-agent': 'my agent'}
#--------------some comment:
page = requests.get(URL, headers=browser)
soup = BeautifulSoup(page.content, 'html.parser')
#---------------some comment:
chart = soup.find("div",{"class":"popover-container justify-content-center p-relative"}).script.get_text()
tokens = esprima.tokenize(chart)
token_iterator = iter(tokens)
for token in token_iterator:
if token["type"] == "Identifier" and token["value"] == "max":
value_token = next(next(token_iterator))
result = value_token["value"]
Любая помощь будет принята с благодарностью!
1 ответ
Решение
Быстрое решение для извлечения максимального значения - использовать split
на chart
:
import requests
from bs4 import BeautifulSoup
URL = 'https://downdetector.com/status/facebook/'
browser = {'user-agent': 'my agent'}
page = requests.get(URL, headers=browser)
soup = BeautifulSoup(page.content, 'html.parser')
chart = soup.find("div",{"class":"popover-container justify-content-center p-relative"}).script.get_text()
max_val= chart.split("max: ")[1].split(",")[0]
print(max_val)
OUT: 64