2014-11-03 4 views
-1

Я пытаюсь разобрать ответ JSON от HTTP-запроса в Python. Но я получаю следующее исключение:Parse Json String из ответа HTTP

ValueError: No JSON object could be decoded 

код Python:

profile = webdriver.FirefoxProfile() 
profile.set_preference('network.http.phishy-userpass-length', 255) 
browser = webdriver.Firefox(firefox_profile=profile) 
browser.get("https://"+username+":"+password+"@"+url) 
htmltext= str(browser.page_source) 
html=soup(htmltext) 
jsondata= str(html.find('pre')).strip('</pre>') 
data=json.loads(jsondata) 
print data['entries'] 

JSON ответ:

{ 
    "count":1, 
    "entries": 
    [ 
     { 
     "id":15862, 
     "application":loginAudit, 
     "user":[email protected], 
     "time":"2014-10-30T02:08:14.103-04:00", 
     "values": 
     { 
       "\/loginAudit\/login\/no-error\/user":"[email protected]" 
     } 

     } 
    ] 
} 
+0

Я не вижу, как вы инициализируете jsondata. –

+0

Откуда берется 'jsondata'? –

+0

Обратите внимание, что JSON, который вы опубликовали здесь, недействителен; нет никаких кавычек вокруг значений 'application' и' user'. Вы можете проверить, что что-то действительно JSON, используя linter. JSONLint.com предоставляет один онлайн-доступ. –

ответ

2

Я вижу несколько проблем здесь, но два, которые выделяются большинство из них :

  1. Вы используют BeautifulSoup для анализа страницы. Если вы действительно получаете только текст, похожий на JSON, который вы опубликовали, BeautifulSoup не сможет его разобрать. Даже если он не выдал ошибку, выход будет иметь форму HTML, а не JSON.

  2. Страница, которую вы показываете, на самом деле не действительна JSON. Значения для application и user не котируются вообще.

Я также несколько озадачен тем, почему вы используете Selenium для получения ответа. Если на этой конкретной странице не выполняется JavaScript (для которого вы действительно можете использовать настоящий браузер для его выполнения), похоже, что вы используете бульдозер, чтобы попытаться взломать гайку.

Использование стандартных инструментов библиотеки (urllib2 или urllib.request, в зависимости от версии Python) должно быть достаточным, возможно, с несколькими явными HTTP-заголовками. Лично я использовал бы requests module для таких задач; он даже поставляется со встроенной обработкой JSON.

+0

На самом деле, я не получаю простую строку JSON в качестве ответа, но строку html, поэтому я использовал BeautifulSoup для ее анализа и поиска JSON, хранящегося внутри тега. Я не опубликовал все эти детали. извините за неясность – charan

+1

@charan: возможно, ваш метод извлечения неверен. Возможно, что вы разбираете JavaScript, а не строгий JSON. Может быть, информация, которую вы хотели извлечь, лучше обрабатывается с регулярным выражением и т. Д. Вот почему вам нужно: a) быть понятным, какую проблему вы действительно решаете (а не просто проблемы с тем, как вы пытались ее решить самостоятельно) и b) дать нам воспроизводимый образец, чтобы мы могли попробовать и устранить неполадки. Вы не дали нам ни одного, поэтому я могу дать вам общий совет. –

+0

Причиной использования Selenium является URL-адрес, к которому я обращаюсь, использует самозаверяющий сертификат, поэтому при использовании библиотек urllib2 он бросает исключения, связанные с SSL. Спасибо @Martijin, я запомню ваш совет. – charan