Python中从字符串提取JSON对象及items字段的正则匹配求助
从React渲染代码中提取items字段的JSON数据
你之前用的正则[items?:?]\s(".*")没法正确匹配到目标数据,因为items后面跟着的是嵌套的数组对象,不是单个字符串,而且正则的匹配逻辑也没覆盖到数组的完整结构。我给你两种靠谱的解决方案:
方法一:正则配合JSON解析
先通过正则定位到items对应的数组内容,再把JS对象格式转成JSON能识别的格式,最后解析成Python对象。
import re import json # 你的原始响应文本 response_text = '''ReactDOM.render(React.createElement(BoxedLinksListView, { initialState: { items: [{ link: "https://www.sehir.edu.tr/en/academics/college-of-humanities-and-social-sciences", sort: 1, parentTitle: "", title: "College of Humanities and Social Sciences" }, { link: "https://www.sehir.edu.tr/en/academics/graduate-school-of-business/mba-in-islamic-finance-and-economics", sort: 82, parentTitle: "Graduate School of Business", title: "MBA in Islamic Finance and Economics (Thesis)" }, { link: "https://www.sehir.edu.tr/en/academics/graduate-school-of-business/mba-in-islamic-finance-and-economics", sort: 83, parentTitle: "Graduate School of Business", title: "MBA in Islamic Finance and Economics (Non-thesis)" }] } }''' # 匹配items: 后面的整个数组内容 match = re.search(r'items:\s*(\[.*?\])', response_text, re.DOTALL) if match: # 提取到的数组字符串(JS格式) items_js_str = match.group(1) # 把JS里不带引号的键替换成JSON要求的带双引号的键 items_json_str = re.sub(r'(\w+):', r'"\1":', items_js_str) # 解析成Python列表 items_data = json.loads(items_json_str) print("提取到的items数据:") print(items_data) else: print("未找到items字段")
方法二:用专业库解析JS对象
如果你的数据结构更复杂,正则容易出错,可以用demjson库直接解析JS对象字面量,不用手动处理引号问题。
首先安装依赖:
pip install demjson
然后编写代码:
import re import demjson response_text = '''ReactDOM.render(React.createElement(BoxedLinksListView, { initialState: { items: [{ link: "https://www.sehir.edu.tr/en/academics/college-of-humanities-and-social-sciences", sort: 1, parentTitle: "", title: "College of Humanities and Social Sciences" }, { link: "https://www.sehir.edu.tr/en/academics/graduate-school-of-business/mba-in-islamic-finance-and-economics", sort: 82, parentTitle: "Graduate School of Business", title: "MBA in Islamic Finance and Economics (Thesis)" }, { link: "https://www.sehir.edu.tr/en/academics/graduate-school-of-business/mba-in-islamic-finance-and-economics", sort: 83, parentTitle: "Graduate School of Business", title: "MBA in Islamic Finance and Economics (Non-thesis)" }] } }''' # 先定位到initialState的对象部分 match = re.search(r'initialState:\s*({.*?})', response_text, re.DOTALL) if match: state_js_str = match.group(1) # 直接解析JS对象为Python字典 state_data = demjson.decode(state_js_str) # 获取items字段 items_data = state_data['items'] print("提取到的items数据:") print(items_data) else: print("未找到initialState")
这两种方法都能帮你顺利提取到items里的所有数据,你可以根据自己的需求选择~
内容的提问来源于stack exchange,提问作者iamrkasula
相关产品推荐
相关产品推荐

