2013-05-02 2 views
1

Этот код для загрузки json-файла с URL-адреса работает хорошо, когда я набираю команды один за другим в оболочке python. Однако, когда я пытаюсь запустить модуль, содержащий этот код, я получаю: ValueError: No JSON object could be decoded. Есть идеи, почему? Я запускаю python 2.7.Код работает в оболочке, но не с модуля

import urllib2 
from urllib2 import Request 
import json 
import re 

url1 = "http://www.skyscanner.net/flights/lond/nyca/130514/130525/airfares-from-london-to-new-york-in-may-2013.html" 

req = Request(url1) 
res = urllib2.urlopen(req) 
the_page = res.read() 
theText = str(the_page) 

myre = re.compile(r'"SessionKey":"((([a-z0-9]+-)+)[a-z0-9]{12})"') 
match = re.search(myre, theText) 

print match.group(1) 

url2 = "http://www.skyscanner.net/dataservices/routedate/v2.0/"+str(match.group(1)) 
htmltext = urllib2.urlopen(url2) 
data = json.load(htmltext) 

весь код прямо сейчас:

import urllib2 
from urllib2 import Request, urlopen, URLError, HTTPError 
import json 
import re 


url1 = "http://www.skyscanner.net/flights/lond/nyca/130514/130525/airfares-from-london-to-new-york-in-may-2013.html" 

req = Request(url1) 
res = urllib2.urlopen(req) 
the_page = res.read() 
theText = str(the_page) 

myre = re.compile(r'"SessionKey":"((([a-z0-9]+-)+)[a-z0-9]{12})"') 
match = re.search(myre, theText) 

url2 = "http://www.skyscanner.net/dataservices/routedate/v2.0/%s" % str(match.group(1)) 

req2 = urllib2.Request(url2) 

try: 
    response = urlopen(req2) 
except HTTPError as e: 
    print 'The server couldn\'t fulfill the request.' 
    print 'Error code: ', e.code 
except URLError as e: 
    print 'We failed to reach a server.' 
    print 'Reason: ', e.reason 
else: 
    data = json.loads(response.read()) 

print data["SessionKey"] 
+0

Это потому, что ваш объект JSON не может быть декодирован, то есть 'htmltext' не является json. – danodonovan

+0

, но зачем он работал в оболочке? – maddy

+0

он не работает в моей оболочке, извините – danodonovan

ответ

0

Ха! Вы были правы, это разница между использованием оболочки и использованием скриптов. Независимо от того, что делает url1, он не завершил (удаленно) к моменту открытия url2. Включение короткого времени ожидания заставляет все это работать!

import time 

url2 = "http://www.skyscanner.net/dataservices/routedate/v2.0/%s" % str(match.group(1)) 

time.sleep(5) 

req2 = urllib2.Request(url2) 

так что это был не ваш код вообще ... ho hum!

+0

Человек! Молодец! Спасибо! – maddy

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