2016-05-20 2 views
1

У меня возникли проблемы с выяснением, почему я получаю этот ValueError ... Чтобы дать некоторый контекст, я очищаю данные json сайтов, используя запросы, BeautifulSoup и json с помощью python.Проблема с вычислением ValueError с json, запросы, BeautifulSoup: ValueError (errmsg («Дополнительные данные», s, end, len (s)))

Я не уверен, почему он не работает для этого URL-адреса. Я сделал это с несколькими другими URL-адресами без проблем. Даже «страница 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]: // 

Заранее спасибо !!!

ответ

1

Причина, по которой ваши ошибки кода очевидны, если вы посмотрите на ошибку и что выглядит str(soup), вы можете увидеть, что в конце добавлено </a></a>, что означает, что у вас есть недопустимый json.

Это не имеет никакого смысла, чтобы попытаться использовать json.loads на BeautifulSoup объекта, если вы называли его на что-либо было бы .content но правильное решение, это просто позвонить .json.

page_json_dict = r.json() 
+0

Я по-прежнему новичок в программировании, и иногда, когда я получаю что-то на работу, я бегу с ним, хотя это может и не быть оптимальным решением. Несмотря ни на что, это сработало, поэтому я ценю помощь, несмотря на то, что она пришла с ненужным количеством враждебности ... Но спасибо! :) – Zach

+0

@zacheism, есть нулевая враждебность, на самом деле не имеет смысла конвертировать в суп, а затем в json, также если вы посмотрите на traceback, вы можете увидеть 'char 18923 - 18931', который сообщает вам, где именно проблема ложь, поэтому, если вы напечатаете (str (суп [18923: 18931])), который покажет вам причину ошибки. –

+0

ну в этом случае извините. Я использовал суп, потому что это как-то, как я изучил запросы и потому, что он используется по другим причинам в сценарии (не показано здесь). Но, похоже, я не знал/не думал об этом. И даже так, я не думаю, что я бы понял, что тег привязки с двойным концом будет означать недопустимый json - в чем причина? А также, почему решение изменилось? – Zach

Смежные вопросы