如何解析BS4提取的含空元素的JavaScript数组?
解决JS数组空元素导致
literal_eval解析失败的问题 方法一:预处理字符串,兼容Python解析
问题核心是JavaScript里的空元素(连续逗号)在Python的ast.literal_eval中没有合法对应,只需先把字符串里的连续逗号替换成Python能识别的None占位符,再解析即可:
- 提取纯数组部分(去掉开头的
input:) - 用正则把所有连续逗号(
,,)替换成, None, - 最后用
literal_eval解析成Python列表
示例代码:
import re from ast import literal_eval # 你提取到的原始字符串 raw_str = "input: [162,13,'Crystal Palace','Arsenal','05/08/2022 20:00:00','05/08/2022 00:00:00',6,'FT','0 : 1','0 : 2',,,'0 : 2','England','England']" # 提取纯数组字符串 array_str = re.search(r"\[.*?\]", raw_str).group(0) # 替换连续逗号为带None的格式 processed_str = re.sub(r",,", ", None,", array_str) # 解析成Python列表 result = literal_eval(processed_str) print(result)
输出会把原来的空元素转为None,完美适配Python列表结构。
方法二:用JS专用解析库(更简便可靠)
如果不想手动写正则处理,直接用支持JavaScript语法的解析库,比如demjson或js2py,它们能直接识别JS里的空元素:
使用demjson的示例:
先安装库:pip install demjson
import demjson import re raw_str = "input: [162,13,'Crystal Palace','Arsenal','05/08/2022 20:00:00','05/08/2022 00:00:00',6,'FT','0 : 1','0 : 2',,,'0 : 2','England','England']" array_str = re.search(r"\[.*?\]", raw_str).group(0) # 直接解析JS数组 result = demjson.decode(array_str) print(result)
这个方法无需手动处理空元素,库会自动把JS空元素转为Python的None,更省心,还能应对更复杂的JS语法场景(比如字符串包含逗号的情况)。
更简便的实现思路
其实可以一步到位:直接用正则匹配整个数组内容,然后交给JS解析库处理,或者预处理后用literal_eval。如果频繁处理这类JS数据,优先用专用库,避免自己写正则出现边界问题。
内容的提问来源于stack exchange,提问作者Verance
相关产品推荐
相关产品推荐

