python 解析 js array 问题求助

2016-09-20 21:59:06 +08:00
 SlipStupig

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 )资源占用比较高,

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

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

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

鉴于你这么言之凿凿,劳烦自己按一楼的提示再去找找吧。
binux
2016-09-20 23:01:25 +08:00
demjson
SlipStupig
2016-09-20 23:39:18 +08:00
@jigloo 想知道“就不告诉你这个函数到底做了什么。。。。。”
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'

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/307663

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX