【问题标题】:Trouble figuring out ValueError with json, requests, BeautifulSoup: ValueError(errmsg("Extra data", s, end, len(s)))无法用 json、requests、BeautifulSoup 找出 ValueError:ValueError(errmsg("Extra data", s, end, len(s)))
【发布时间】:2016-09-18 05:55:36
【问题描述】:

我无法弄清楚为什么会出现这个 ValueError...为了提供一些上下文,我正在使用请求、BeautifulSoup 和带有 python 的 json 来抓取网站的 json 数据。

我不确定为什么它不适用于此 URL。我已经用其他几个 URL 完成了,没有问题。甚至 'page 2' (http://hypem.com/playlist/loved/Bigdirtyian/json/2/data.js) 也被成功抓取并存储在字典中。

我已经包含了 iPython 输入/输出(有问题的 URL 和成功的一页 - 第 3 页和第 2 页,分别):

In [1]: url = 'http://hypem.com/playlist/loved/Bigdirtyian/json/3/data.js'

In [2]: import json

In [3]: import requests

In [4]: from bs4 import BeautifulSoup

In [5]: r = requests.get(url)

In [6]: content = r.content

In [7]: soup = BeautifulSoup(content, 'html.parser')

In [8]: page_json_dict = json.loads(str(soup))
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-8-18cc0e11884e> in <module>()
----> 1 page_json_dict = json.loads(str(soup))

/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/__init__.pyc in loads(s, encoding, cls, object_hook, parse_float, parse_int, parse_constant, object_pairs_hook, **kw)
    336             parse_int is None and parse_float is None and
    337             parse_constant is None and object_pairs_hook is None and not kw):
--> 338         return _default_decoder.decode(s)
    339     if cls is None:
    340         cls = JSONDecoder

/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/decoder.pyc in decode(self, s, _w)
    367         end = _w(s, end).end()
    368         if end != len(s):
--> 369             raise ValueError(errmsg("Extra data", s, end, len(s)))
    370         return obj
    371 

ValueError: Extra data: line 1 column 18924 - line 1 column 18932 (char 18923 - 18931)

In [9]: url2 = 'http://hypem.com/playlist/loved/Bigdirtyian/json/2/data.js'

In [10]: r2 = requests.get(url2)

In [11]: content2 = r2.content

In [12]: soup2 = BeautifulSoup(content2, 'html.parser')

In [13]: page_json_dict2 = json.loads(str(soup2))

In [14]: //

提前致谢!!!

【问题讨论】:

    标签: python json web-scraping beautifulsoup python-requests


    【解决方案1】:

    如果您查看错误以及str(soup) 的外观,您的代码错误的原因非常明显,您可以看到在末尾添加了&lt;/a&gt;&lt;/a&gt;,这意味着您的json 无效。

    尝试在 Beautifulsoup 对象上使用 json.loads 是没有任何意义的,如果你在任何东西上调用它都会是 .content 但正确的解决方案是调用 .json。

    page_json_dict = r.json()
    

    【讨论】:

    • 我在编程方面还是个新手,有时当我得到一些工作时,我会使用它,即使它可能不是最佳解决方案。无论如何,这很有效,所以我很感激你的帮助,尽管它带来了不必要的敌意......但谢谢你! :)
    • @zacheism,敌意为零,转换为soup然后转换为json确实没有意义,如果您查看回溯,您可以看到char 18923 - 18931,它告诉您确切的位置问题在于,如果你print(str(soup[18923:18931])) 会告诉你是什么导致了错误。
    • 好吧,在这种情况下,我很抱歉。我之所以使用soup,是因为这有点像我学习请求的方式,并且因为它在脚本中用于其他原因(此处未显示)。但是啊,我不知道/想这样做。即便如此,我认为我不会意识到双端锚标记意味着无效的 json - 这是什么原因?另外,为什么解决方案会改变这一点?
    • @zacheism,bs4 正在添加锚标记,为什么我不知道,每个解析器都可以以不同的方式解析您的源代码。如果您只使用从请求返回的内容,那么就不会有添加任何错误数据的危险。格式是无效的,好像你在想,json应该为dict末尾的anchor返回什么?
    • 结束大括号。是的,很有意义....猜想这很明显;)再次感谢(也感谢学校教育)!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-02
    • 1970-01-01
    • 1970-01-01
    • 2014-11-10
    • 1970-01-01
    • 2019-01-25
    相关资源
    最近更新 更多