2014-01-31 4 views
0

На Python3.2 я получаю следующее сообщение об ошибке при попытке получить HTML с удаленного сайта, он хорошо работает на Python 2.7Кодирование ошибки при выборке HTML

enter image description here

Код:

def connectAmazon(): 
    usleep = lambda x: sleep(x/1000000.0) 
    factor = 400 
    shouldRetry = True 
    retries = 0 
    headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.102 Safari/537.36'} 
    attempt = 0 
    while shouldRetry == True: 
     random = randint(2, 9) 
     attempt += 1 
     print ("Attempt#", attempt) 
     #print (attempt) 
     url = "http://rads.stackoverflow.com/amzn/click/B009OZUPUC" 
     html = requests.get(url) 
     status = html.status_code 
     if status == 200: 
      shouldRetry = False 
      print ("Success. Check HTML Below") 
      print(html.text) #The Buggy Line 
      break 
     elif status == 503: 
      retries += 1 
      delay = random * (pow(retries, 4)*100) 
      print ("Delay(ms) = ", delay) 
      #print (delay) 
      usleep(delay) 
      shouldRetry = True 


connectAmazon() 

Что нужно сделать для решения этой проблемы на Python 3.2 или Py 3.x?

+1

Это поможет некоторым некоторым действительным кодам. Специально тот, который имеет дело с выходом. –

+0

Общий совет: Мы ** НЕНАВИЖНЫЕ ** скриншоты ошибок. они не доступны для поиска. Это командная строка Windows. вы можете пометить/скопировать текстовое содержимое окна, щелкнув значок «cmd» в левом верхнем углу и выбрав различные опции под подменю «edit». –

+0

@MarcB был отправлен одним из разработчиков, так как я не могу произвести результат на моей машине. Я попросил его отправить текст. – Volatil3

ответ

2

ОК, Windows Command Line очень проблематично с кодировками *. Ошибка кодирования заключается в том, что при выводе print кодирует html.text в кодировку cmd (вы можете узнать, какой из них она выдает, выписав команду chcp). Вероятно, есть один символ в html.text, который не может быть закодирован в кодировке cmd.

Мое решение для Python3 будет вызывать выходное кодирование. К сожалению, в Python3 это немного более проблематично, чем хотелось бы. Вам нужно заменить строку print(html.text) для:

import sys 
sys.stdout.buffer.write(html.text.encode('utf8')) 

Конечно, эта линия не будет работать в python2. В python2 вы можете просто encode ваш вывод перед печатью так print(html.text) можно заменить:

print html.text.encode('utf8') 

Важное примечание: В python2 print это ключевое слово, а не функция. Поэтому вызов print('hi') работает, потому что print печатает выражение внутри скобки. Когда вы сделаете print('hi',2), вы получите кортеж ('hi',2). Это не совсем то, что вы хотите. Это работает чудом: D

Надеюсь, это поможет!

* Это связано с отсутствием поддержки utf8. У них есть странная 650001 кодовая страница, которая не совсем то же самое, что и utf-8, и Python не работает с ней.

+0

Я считаю, что ваш предложенный код для 3.x только потому, что на 2.7 я получаю 'AttributeError: 'file' объект не имеет атрибута 'buffer'' – Volatil3

+1

Я объяснил в ответе:« Конечно, эта строка не будет работать в Python2 "_. Я привел пример для обеих версий. Для Python2 вы делаете второй пример: 'print html.text.encode ('utf8')'. Две строки дескриптора версии по-разному, поэтому иметь только один метод для обоих будет сложным. Вы можете проверить версию Python с помощью 'sys.version'. –

+1

+1 для 'sys.version' :) –

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