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
SlipStupig
V2EX  ›  Python

python 解析 js array 问题求助

  •  
  •   SlipStupig · 2016-09-20 21:59:06 +08:00 · 1997 次点击
    这是一个创建于 2782 天前的主题,其中的信息可能已经有所发展或是发生改变。

    JS 代码如下:

    
    var pageConfig = {
        compatible: true,
        product: {
            modules: ['address', 'prom', 'colorsize', 'buytype', 'baitiao', 'o2o', 'buybtn', 'track', 'suits', 'crumb', 'fittings', 'detail', 'contact', 'popbox', 'preview', 'info', 'imcenter', 'jdservice', 'commitments'],
            skuid: 10243462096,
            name: '\u5357\u6781\u4eba\u0020\u56db\u4ef6\u5957\u0020\u7eaf\u68c9\u5e8a\u54c1\u5957\u4ef6\u5168\u68c9\u5e8a\u4e0a\u7528\u54c1\u0020\u5e8a\u5355\u5f0f\u56db\u4ef6\u5957\u0020\u88f8\u5a5a\u65f6\u4ee3\u0020\u0031\u002e\u0035\u002d\u0031\u002e\u0038\u7c73\u5e8a\u9002\u7528\u0028\u88ab\u5957\u0032\u0030\u0030\u002a\u0032\u0033\u0030\u0063\u006d\u0029',
            skuidkey: 'F9F3BECE978D5E0345181BC15517C53B',
            href: '//item.jd.com/10243462096.html',
            src: 'jfs/t1861/55/2425052793/508499/f647fc2d/57060cacNa18bc327.jpg',
            cat: [1620, 1621, 1626],
            forceAdUpdate: '8279',
            brand: 155645,
            pType: 2,
            isClosePCShow: false,
            isPop: true,
            venderId: 215439,
            shopId: '206668',
            commentVersion: '3818',
            specialAttrs: ["isFlashPurchase-2", "is7ToReturn-1"],
            recommend: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
            easyBuyUrl: "//easybuy.jd.com/skuDetail/newSubmitEasybuyOrder.action",
            qualityLife: "//c.3.cn/qualification/info?skuId=10243462096&pid=10048844986&catId=1626",
            colorSize: [{
                "Color": "裸婚时代",
                "SkuId": 10243462096,
                "Size": "1.5-1.8 米床适用(被套 200*230cm)"
            },
            {
                "Color": "航海日记",
                "SkuId": 10243462097,
                "Size": "1.5-1.8 米床适用(被套 200*230cm)"
            },
            {
                "Color": "小清新",
                "SkuId": 10243462098,
                "Size": "1.5-1.8 米床适用(被套 200*230cm)"
            },
            {
                "Color": "海边拾趣",
                "SkuId": 10243462099,
                "Size": "1.5-1.8 米床适用(被套 200*230cm)"
            },
            {
                "Color": "洛卡小镇-桔",
                "SkuId": 10243462100,
                "Size": "1.5-1.8 米床适用(被套 200*230cm)"
            },
            {
                "Color": "似水流年",
                "SkuId": 10243468801,
                "Size": "1.5-1.8 米床适用(被套 200*230cm)"
            },
            {
                "Color": "宠爱-蓝",
                "SkuId": 10243468802,
                "Size": "1.5-1.8 米床适用(被套 200*230cm)"
            },
            {
                "Color": "花音",
                "SkuId": 10243468803,
                "Size": "1.5-1.8 米床适用(被套 200*230cm)"
            },
            {
                "Color": "爱丽丝",
                "SkuId": 10243468804,
                "Size": "1.5-1.8 米床适用(被套 200*230cm)"
            },
            {
                "Color": "浓浓情思",
                "SkuId": 10243468805,
                "Size": "1.5-1.8 米床适用(被套 200*230cm)"
            },
            {
                "Color": "韵律",
                "SkuId": 10243468806,
                "Size": "1.5-1.8 米床适用(被套 200*230cm)"
            },
            {
                "Color": "真爱永恒",
                "SkuId": 10243468807,
                "Size": "1.5-1.8 米床适用(被套 200*230cm)"
            },
            {
                "Color": "图拉朵",
                "SkuId": 10243468808,
                "Size": "1.5-1.8 米床适用(被套 200*230cm)"
            },
            {
                "Color": "彩色梦境-蓝",
                "SkuId": 10243468809,
                "Size": "1.5-1.8 米床适用(被套 200*230cm)"
            },
            {
                "Color": "格莱美-蓝",
                "SkuId": 10243468810,
                "Size": "1.5-1.8 米床适用(被套 200*230cm)"
            },
            {
                "Color": "夏日摩卡",
                "SkuId": 10243468811,
                "Size": "1.5-1.8 米床适用(被套 200*230cm)"
            },
            {
                "Color": "都市情怀",
                "SkuId": 10243468812,
                "Size": "1.5-1.8 米床适用(被套 200*230cm)"
            },
            {
                "Color": "花瓣雨",
                "SkuId": 10243468813,
                "Size": "1.5-1.8 米床适用(被套 200*230cm)"
            },
            {
                "Color": "水手",
                "SkuId": 10243468814,
                "Size": "1.5-1.8 米床适用(被套 200*230cm)"
            },
            {
                "Color": "爱的海洋",
                "SkuId": 10243468815,
                "Size": "1.5-1.8 米床适用(被套 200*230cm)"
            },
            {
                "Color": "化蝶",
                "SkuId": 10243468816,
                "Size": "1.5-1.8 米床适用(被套 200*230cm)"
            },
            {
                "Color": "嫁给我吧",
                "SkuId": 10243468817,
                "Size": "1.5-1.8 米床适用(被套 200*230cm)"
            },
            {
                "Color": "艾米丽",
                "SkuId": 10243468818,
                "Size": "1.5-1.8 米床适用(被套 200*230cm)"
            },
            {
                "Color": "时尚爱-蓝",
                "SkuId": 10243468819,
                "Size": "1.5-1.8 米床适用(被套 200*230cm)"
            }],
            warestatus: 1,
            tips: [{
                "order": 3,
                "tip": "支持 7 天无理由退货"
            }],
            desc: '//d.3.cn/desc/10048844986?cdn=2',
            /**/
            /**/
            twoColumn: false,
            isCloseLoop: true,
            foot: '//d.3.cn/footer?type=common_config2',
            shangjiazizhi: false
        }
    };
    
    

    目前我用的是 PyV8 解析所有的字段(页面的字段内容不是全部相同),感觉效果不太理想,主要是两个方面: 1 )速度有点慢 2 )资源占用比较高,

    想请教一下各位有什么更好的办法可以解析的更快,资源占用更少的

    第 1 条附言  ·  2016-09-20 22:53:06 +08:00

    原因找到了,product里面的字段没有‘’ ,一些关键字不存在,true在python里面是没有定义的。

    解决方案,给没有‘’的关键字加上关键字,替换掉一些没有定义的关键字,然后eval一下就可以转换成字典了,稍后上代码

    10 条回复    2016-09-21 08:41:42 +08:00
    bdbai
        1
    bdbai  
       2016-09-20 22:27:50 +08:00 via Android
    开头和结尾去掉,用第三方 json 库直接加载试试。
    techmoe
        2
    techmoe  
       2016-09-20 22:39:02 +08:00 via Android
    eval 直接把这个花括号变成 py 的 dict 然后赋值给变量?
    zhuangzhuang1988
        3
    zhuangzhuang1988  
       2016-09-20 22:39:47 +08:00
    js:jsonfiy ==> python: json.loads
    SlipStupig
        4
    SlipStupig  
    OP
       2016-09-20 22:40:25 +08:00
    @bdbai 早试过了没用的
    bdbai
        5
    bdbai  
       2016-09-20 22:58:23 +08:00 via Android
    @bdbai 原生 json 库不认 { key: 'value' } 这样的非标准格式,参考这里:
    /t/289319
    bdbai
        6
    bdbai  
       2016-09-20 22:59:24 +08:00 via Android
    好吧你解决了啊。
    jigloo
        7
    jigloo  
       2016-09-20 22:59:25 +08:00   ❤️ 1
    一楼的方法可行,亲测可用,见下图。

    https://cloud.githubusercontent.com/assets/195836/18675705/cf08a6bc-7f85-11e6-919b-66937d458731.gif

    鉴于你这么言之凿凿,劳烦自己按一楼的提示再去找找吧。
    binux
        8
    binux  
       2016-09-20 23:01:25 +08:00
    demjson
    SlipStupig
        9
    SlipStupig  
    OP
       2016-09-20 23:39:18 +08:00
    @jigloo 想知道“就不告诉你这个函数到底做了什么。。。。。”
    bramblex
        10
    bramblex  
       2016-09-21 08:41:42 +08:00
    别打我,这东西自己手动实现一个 parser 也不是很大难度啊 /w\。

    # PEG

    file
    __: 'var' 'pageConfig' '=' expr ';' EOF

    expression
    __: '{' object_body '}'
    __| '[' array_body ']'
    __| NUMBER
    __| BOLLEAN
    __| STRING

    object_body
    __: object_body ',' kev_value
    __| key_value

    key_value
    __: string ':' expression
    __| ID ':' expression

    array_body
    __: array_body ',' expression
    __| expression

    # LEX

    identifier ("_"|{letter})({letter}|{digit}|"_")*
    letter {lowercase}|{uppercase}
    lowercase [a-z]
    uppercase [A-Z]
    digit [0-9]

    string {string_double}|{string_single}
    string_double '"'{stringitem_double}*'"'
    string_single "'"{stringitem_single}*"'"
    stringitem_double {stringchar_double}|{escapeseq}
    stringitem_single {stringchar_single}|{escapeseq}
    stringchar_single [^\\\n\']
    stringchar_double [^\\\n\"]
    escapeseq \\.

    /** numbers **/
    integer {decinteger}|{hexinteger}|{octinteger}
    decinteger ([1-9]{digit}*)
    hexinteger "0"[x|X]{hexdigit}+
    octinteger "0"[o|O]?{octdigit}+
    bininteger "0"[b|B]({bindigit}+)
    hexdigit {digit}|[a-fA-F]
    octdigit [0-7]
    bindigit [0|1]

    /** floats **/
    floatnumber {exponentfloat}|{pointfloat}
    exponentfloat ({digit}+|{pointfloat}){exponent}
    pointfloat ({digit}*{fraction})|({digit}+".")
    fraction "."{digit}+
    exponent [e|E][\+|\-]{digit}+

    /** booleans **/
    boolean "true"|"false"

    symbols "="|":"|","|";"

    brackets "["|"]"|"{"|"}"

    /** whitespaces **/
    whitespaces ([\ \t\f\n])+



    <<EOF>> return 'EOF'
    {whitespaces} /** skip **/
    {symbols|brackets} return yytext
    {floatnumber} return 'NUMBER'
    {integer} return 'NUMBER'
    {boolean} return 'BOOLEAN'
    {string} return 'STRING'

    {identifier} return 'ID'
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2552 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 106ms · UTC 13:12 · PVG 21:12 · LAX 06:12 · JFK 09:12
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.