首页 > 解决方案 > 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. J\u00f3zefa Pi\u0142sudskiego","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新手:<

标签: pythonbeautifulsoup

解决方案


您无法使用 bs4 afaik 从 js 中提取信息。你可以使用正则表达式。

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 字典。


推荐阅读