Python如何解析HTML中script标签内的JSON数据并提取经纬度
问题解决方法
你的三个报错均是未正确提取到合法JSON字符串导致,按以下步骤修正即可:
- 首先,
all_scripts.contents是BeautifulSoup返回的标签子节点列表,你需要的JS文本存储在列表的第一个元素中,直接传入列表会触发类型错误;把列表整体转字符串会带上列表的方括号、引号等语法符号,自然无法解析为JSON。 - 其次,你拿到的原始文本是JS赋值语句,需要先剥离
window.storeFinderComponent =前缀和末尾可能存在的分号,才能得到纯JSON内容。
完整可运行代码如下:
import requests from bs4 import BeautifulSoup import json # 原有页面请求逻辑 sauce = requests.get( 'https://www.ep.de/store-finder', verify=False, headers = {'User-Agent':'Mozilla/5.0'} ) soup1 = BeautifulSoup(sauce.text, features="html.parser") target_script = soup1.find_all('script')[6] # 解析JSON核心逻辑 # 1. 取出script标签内的原始JS字符串 js_content = target_script.contents[0] # 2. 剥离赋值前缀和末尾分号,得到纯JSON字符串 json_str = js_content.split('window.storeFinderComponent = ')[1].strip().rstrip(';') # 3. 转为Python字典 store_data = json.loads(json_str) # 提取经纬度示例 for store in store_data.get('stores', []): print(store.get('lat'), store.get('lng'))
异常排查
如果出现分割索引错误,可先打印js_content确认前缀的实际写法,调整split方法的匹配字符串即可;如果JSON存在JS特有的尾随逗号等语法,可安装使用demjson3库替代标准json库做容错解析。
内容的提问来源于stack exchange,提问作者Lasse Bieber
相关产品推荐
相关产品推荐

