Извлечение данных из скрипта с помощью Beautifulsoup

#python #beautifulsoup

#питон #прекрасный суп

Вопрос:

у меня есть что-то подобное:

 (async () => {
    await import("https://s-gr.cdngr.pl/assets/gratka/v0.40.7/dist/js/Map.js");

    Map.init('#item-map', {
      gratkaMapsUrl: 'https://map.api.gratka.it',
      assetsUrl: 'https://s-gr.cdngr.pl/assets/gratka/v0.40.7/dist/',
      locationApiHost: 'https://locations.api.gratka.it/locations/v1',
      apiUrl: 'https://gratka.api.gratka.it/gratka/v2',
      eventType: 'click',
      statisticsType: 'show_map',
      locationParams: {"lokalizacja_ulica":"aleja Marsz. Ju00f3zefa Piu0142sudskiego","lokalizacja_szerokosc-geograficzna-y":52.231069627971,"lokalizacja_region":"mazowieckie","lokalizacja_powiat":"Warszawa","lokalizacja_miejscowosc":"Warszawa","lokalizacja_kraj":"Polska","lokalizacja_gmina":"Warszawa","lokalizacja_dlugosc-geograficzna-x":21.2497334550424},
      offersId: [18702037]
    });
  })();
 

Я ищу метод для извлечения этих параметров: «lokalizacja_ulica», «lokalizacja_szerokosc-geograficzna-y» и «lokalizacja_dlugosc-geograficzna-x». Есть какие-нибудь идеи? Я новичок в python: <

Ответ №1:

Вы не можете извлекать информацию из js с помощью bs4 afaik. Однако вы можете использовать регулярное выражение.

 from bs4 import BeautifulSoup
import json
import re

soup = BeautifulSoup(<html text>)
script = soup.find('script').string
match = re.search(r'(?<=locationParams: ). (?=,n)', script, re.M).group(0)
data = json.loads(match)
 

(?<=locationParams: ). (?=,n) шаблон ищет все, что имеет «locationParams: » перед и фигурную скобку, за которой следует символ новой строки. Затем вы можете передать эту строку в json.loads(), который превращает ее в словарь python.