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

json 格式化的时候报错

  •  
  •   Ewig · 2019-01-09 12:35:49 +08:00 · 2566 次点击
    这是一个创建于 2151 天前的主题,其中的信息可能已经有所发展或是发生改变。

    http://xxgk.miit.gov.cn/gdnps/searchIndex.jsp?params=%257B%2522goPage%2522%253A4%252C%2522orderBy%2522%253A%255B%257B%2522orderBy%2522%253A%2522publishTime%2522%252C%2522reverse%2522%253Atrue%257D%252C%257B%2522orderBy%2522%253A%2522orderTime%2522%252C%2522reverse%2522%253Atrue%257D%255D%252C%2522pageSize%2522%253A10%252C%2522queryParam%2522%253A%255B%257B%257D%252C%257B%257D%252C%257B%2522shortName%2522%253A%2522fbjg%2522%252C%2522value%2522%253A%2522%252F1%252F29%252F1146295%252F1652858%252F1652930%2522%257D%255D%257D&callback=jQuery111102456514014162614_1546997791362&_=1546997791366

    我直接 json.loads(response.text)

    返回的报错

    Traceback (most recent call last): 780 File "/home/shenjianlin/.local/lib/python3.4/site-packages/twisted/internet/defer.py", line 653, in _runCallbacks 781 current.result = callback(current.result, *args, **kw) 782 File "/home/shenjianlin/my_project/Espider/Espider/spiders/xxgkmiit.py", line 31, in parse 783 _origin=json.loads(response.text) 784 File "/usr/lib64/python3.4/json/init.py", line 318, in loads 785 return _default_decoder.decode(s) 786 File "/usr/lib64/python3.4/json/decoder.py", line 343, in decode 787 obj, end = self.raw_decode(s, idx=_w(s, 0).end()) 788 File "/usr/lib64/python3.4/json/decoder.py", line 361, in raw_decode 789 raise ValueError(errmsg("Expecting value", s, err.value)) from None 790 ValueError: Expecting value: line 1 column 1 (char 0)

    18 条回复    2019-01-10 10:04:35 +08:00
    Trim21
        1
    Trim21  
       2019-01-09 12:37:40 +08:00
    Sylv
        2
    Sylv  
       2019-01-09 12:38:12 +08:00 via iPhone
    把外围的 jQuery111102456514014162614_1546997791362(); 去掉才是合法 json 格式。
    vincentxue
        3
    vincentxue  
       2019-01-09 13:05:39 +08:00 via iPhone
    说明做了 MIIT 的程序员做了防 JSON 劫持。原因可以参见这里: http://www.10tiao.com/html/788/201811/2247489959/1.html
    royzxq
        4
    royzxq  
       2019-01-09 13:12:14 +08:00
    请参考 #1 #2
    Ewig
        7
    Ewig  
    OP
       2019-01-09 15:11:45 +08:00
    @fan2006 Traceback (most recent call last):
    922 File "/home/shenjianlin/.local/lib/python3.4/site-packages/twisted/internet/defer.py", line 653, in _runCallbacks
    923 current.result = callback(current.result, *args, **kw)
    924 File "/home/shenjianlin/my_project/Espider/Espider/spiders/xxgkmiit.py", line 30, in parse
    925 _origin=json.loads(response.text.split(');\r\n')[0][1:])
    926 File "/usr/lib64/python3.4/json/__init__.py", line 318, in loads
    927 return _default_decoder.decode(s)
    928 File "/usr/lib64/python3.4/json/decoder.py", line 343, in decode
    929 obj, end = self.raw_decode(s, idx=_w(s, 0).end())
    930 File "/usr/lib64/python3.4/json/decoder.py", line 361, in raw_decode
    931 raise ValueError(errmsg("Expecting value", s, err.value)) from None
    932 ValueError: Expecting value: line 1 column 1 (char 0)
    hoythan
        8
    hoythan  
       2019-01-09 15:14:15 +08:00
    @Sylv 加这个明明是为了 jsonp 好吗... callback(json)
    Ewig
        9
    Ewig  
    OP
       2019-01-09 15:16:11 +08:00
    @Sylv 如何去掉呢
    est
        10
    est  
       2019-01-09 15:18:15 +08:00
    @Ewig python 面试题:

    已知一个字符串 "callback(json)"

    如何去掉外层的 callback() 得到 "json" 这个字符串
    wd
        12
    wd  
       2019-01-09 15:20:20 +08:00
    连字符串操作都不会还写什么代码。。。。
    hoythan
        13
    hoythan  
       2019-01-09 15:21:10 +08:00
    原理就是 script 的方式加载接口解决跨域的问题,然后 js 内容是执行一个函数,至于函数名称就是 你自己定义的 callback
    然后加载好 js 后就会跑你定义的 callback,你就可以拿到数据。
    jsonp 知识了解下:
    https://blog.csdn.net/hansexploration/article/details/80314948
    hoythan
        14
    hoythan  
       2019-01-09 15:24:50 +08:00
    @Sylv @错人了

    应该是 @vincentxue
    hoythan
        15
    hoythan  
       2019-01-09 15:25:54 +08:00
    Sylv
        16
    Sylv  
       2019-01-09 15:32:21 +08:00 via iPhone
    @hoythan 我了解这是为了 jsonp,但是 lz 的需求是用 Python 读取这段 json,最直接的方法就是去掉 callback() 后 json.loads,他肯定不懂且也不需要去了解 jsonp 知识。
    Sylv
        17
    Sylv  
       2019-01-09 15:35:47 +08:00 via iPhone
    @Ewig 如果你不知道如何去掉外围的字符串,我建议你是停下来先认真学习一遍 Python 和编程基础知识。
    vincentxue
        18
    vincentxue  
       2019-01-10 10:04:35 +08:00 via iPhone
    @hoythan 受教了,看走眼了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2154 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 00:42 · PVG 08:42 · LAX 16:42 · JFK 19:42
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.