V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
qazwsxkevin
V2EX  ›  Python

JavaScript 里的嵌套数组,转为字典的问题。。。

  •  
  •   qazwsxkevin · 2021-02-22 11:18:37 +08:00 · 2272 次点击
    这是一个创建于 1404 天前的主题,其中的信息可能已经有所发展或是发生改变。

    如:

    JSArrayStr = """var foods = [[19,'奶油布丁','Cream Pudding','2719-3',0],[20,'日式多味卷','Japan Roll Cake','2719-166',0],[21,'虎皮千层','TigerSkin Cake','2719-27',0],[22,'肉松吐司','Meat Floss Toast','2719-5',0],[23,'巧克力布丁','Chocolate Pudding ','2719-13',0],[24,'法式长棍','Long Baguette','2719-2',0],[25,'提拉米苏','Tiramisu','2719-6',0],[26,'水果塔','Fruit Tower','2719-74',0],[27,'港式班戟','HK Pancake','2719-156',0]];"""
    

    像是这种结构的数组,如果直接用 json.loads(JSArray)报错的,只能手工对 JSArrayStr 做文本硬处理吗?(硬处理指:手工逐个细节(split 又 strip)*N 次再写入到新字典)
    Python 是否有更强大的轮子可以直接弄出字典?

    12 条回复    2021-02-22 16:27:50 +08:00
    SakuraKuma
        1
    SakuraKuma  
       2021-02-22 11:47:04 +08:00   ❤️ 1
    如果所有数据都是这样可以先把头的变量和尾的分号删了, 把引号都变"就可以转了.
    rodrick
        2
    rodrick  
       2021-02-22 11:50:15 +08:00   ❤️ 1
    淦,看个数组看饿了
    jones2000
        3
    jones2000  
       2021-02-22 12:24:10 +08:00   ❤️ 1
    字符串直接用 js 编译下, 不就出来了嘛。这个不就是 1 个 js 语句嘛。
    Rhilip
        4
    Rhilip  
       2021-02-22 12:34:02 +08:00   ❤️ 1
    如果字符串是这样的,那 eval 是最好的办法,直接从字面量变成 foods 变量,再 Array.map 就好,
    如果 eval 不行,那就用 new Function(JSArrayStr + ';return foods;')() 获取 foods 变量
    Rhilip
        5
    Rhilip  
       2021-02-22 12:36:57 +08:00
    哦,这是在 Python 中解析 javascript ? 那就只能参照 1L,掐头去尾做替换了
    palmers
        6
    palmers  
       2021-02-22 12:42:28 +08:00   ❤️ 1
    JSON.parse("var foods = [[19,'奶油布丁','Cream Pudding','2719-3',0],[20,'日式多味卷','Japan Roll Cake','2719-166',0],[21,'虎皮千层','TigerSkin Cake','2719-27',0],[22,'肉松吐司','Meat Floss Toast','2719-5',0],[23,'巧克力布丁','Chocolate Pudding ','2719-13',0],[24,'法式长棍','Long Baguette','2719-2',0],[25,'提拉米苏','Tiramisu','2719-6',0],[26,'水果塔','Fruit Tower','2719-74',0],[27,'港式班戟','HK Pancake','2719-156',0]];".split('=')[1].split(';')[0].replaceAll("\'", "\""));
    palmers
        7
    palmers  
       2021-02-22 12:42:49 +08:00
    然后遍历处理就可以了吧?
    palmers
        8
    palmers  
       2021-02-22 12:43:48 +08:00
    楼主你这个字符串 我认为不可能有一个到位的轮子 这完全是一个个性的字符串 没有业务通用性
    JellyL
        9
    JellyL  
       2021-02-22 13:17:07 +08:00   ❤️ 1
    是用 python 在做 ast 语义分析吗?
    那要用 ast 库,json.loads()不一定直接起作用
    前面的截取没用 strip,如果都是这种用单引号结构化的纯数组 js,直接 index 吧

    ```
    import ast

    JSArrayStr = """var foods = [[19,'奶油布丁','Cream Pudding','2719-3',0],[20,'日式多味卷','Japan Roll Cake','2719-166',0],[21,'虎皮千层','TigerSkin Cake','2719-27',0],[22,'肉松吐司','Meat Floss Toast','2719-5',0],[23,'巧克力布丁','Chocolate Pudding ','2719-13',0],[24,'法式长棍','Long Baguette','2719-2',0],[25,'提拉米苏','Tiramisu','2719-6',0],[26,'水果塔','Fruit Tower','2719-74',0],[27,'港式班戟','HK Pancake','2719-156',0]];"""

    startIndex = JSArrayStr.index('[')
    endIndex = JSArrayStr.index(';')
    temp = JSArrayStr[startIndex:endIndex]

    result = ast.literal_eval(temp)
    print(result)

    ```
    no1xsyzy
        10
    no1xsyzy  
       2021-02-22 14:50:39 +08:00   ❤️ 1
    看上去可以截头去尾然后 ast.literal_eval
    nekochyan
        11
    nekochyan  
       2021-02-22 16:01:12 +08:00   ❤️ 1
    你这个不是嵌套数组问题,是你这段字符串本身是一句 js 可执行代码,需要自己掐去头尾分析
    krixaar
        12
    krixaar  
       2021-02-22 16:27:50 +08:00   ❤️ 1
    from selenium import webdriver
    from selenium.webdriver.chrome.options import Options
    import json

    chrome_options = Options()
    chrome_options.headless = True
    driver = webdriver.Chrome(options=chrome_options)
    result = json.loads(driver.execute_script(JSArrayStr+'return JSON.stringify(foods);'))
    driver.quit()

    现代问题需要现代手段.jpg
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   939 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 21:14 · PVG 05:14 · LAX 13:14 · JFK 16:14
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.