2013-12-23 3 views
1

Я изучаю python, выполняя задачу python с помощью python3.3, и я нахожусь на question eight. В разметке есть комментарий, в котором вы получите две сжатые строки bz2 unicode, выводящие строки байтов, один для имени пользователя и один для пароля. Там также есть ссылка, где вам нужны распакованные учетные данные для ввода. Один из способов легко решить эту проблему просто вручную скопировать строки и присвоить его двух переменных как байтовые строки, а затем просто использовать библиотеку bz2, чтобы разархивировать его:Строки Unicode в байтовые строки без добавления обратных косых черт

>>>un=b'BZh91AY&SYA\xaf\x82\r\x00\x00\x01\x01\x80\x02\xc0\x02\x00 \x00!\x9ah3M\x07<]\xc9\x14\xe1BA\x06\xbe\x084' 
>>>print(bz2.decompress(un).decode('utf-8')) 
huge 

Но это не для меня, так как я хочу ответ, просто запустив мой файл python. Моего следующий код:

>>>import bz2, re, requests 

>>>url = requests.get('http://www.pythonchallenge.com/pc/def/integrity.html') 
>>>un = re.findall(r'un: \'(.*)\'',url.text)[0] 
>>>correct=b'BZh91AY&SYA\xaf\x82\r\x00\x00\x01\x01\x80\x02\xc0\x02\x00 \x00!\x9ah3M\x07<]\xc9\x14\xe1BA\x06\xbe\x084' 
>>>print(un,un is correct,sep='\n') 
b'BZh91AY&SYA\\xaf\\x82\\r\\x00\\x00\\x01\\x01\\x80\\x02\\xc0\\x02\\x00 \\x00!\\x9ah3M\\x07<]\\xc9\\x14\\xe1BA\\x06\\xbe\\x084' 
False 

Проблема заключается в том, что, когда он переходит из Юникода строки в байтах строки вылетающему обратный слэш добавляется, так что она не может быть прочитана модулем BZ2. Я пробовал все, что знаю, и что встал, когда я искал.

Как получить его из unicode в байт, чтобы он не изменился?

+1

Я до сих пор тестирование, чтобы увидеть, если это фактическая ошибка, но 'is' не является правильным оператором, чтобы увидеть, если вы правильно извлечь содержимое. 'is' тесты для равенства объектов, а не для семантического равенства. –

+0

Спасибо за ваше время, вы придумали что-нибудь? Кажется, что невозможно удалить или заменить одну из косых черт, и я не знаю, как назначить строку юникода в виде байтовой строки без ее преобразования. Благодарим вас за комментарий к инструкции 'is'. – Jayus

ответ

0

Обратные косые черты присутствуют в источнике HTML, поэтому неудивительно, что модуль requests сохраняет их. У меня нет requests, установленного в моей среде Python 3, поэтому я не смог точно воспроизвести вашу ситуацию, но мне кажется, что если вы начнете захватывать окружающие символы ', вы можете использовать ast.literal_eval для синтаксического анализа последовательности символов в массив байт:

>>> test 
"'BZh91AY&SYA\\xaf\\x82\\r\\x00\\x00\\x01\\x01\\x80\\x02\\xc0\\x02\\x00 \\x00!\\x9ah3M\\x07<]\\xc9\\x14\\xe1BA\\x06\\xbe\\x084'" 
>>> import ast 
>>> res = ast.literal_eval("b%s" % test) 
>>> import bz2 
>>> len(bz2.decompress(res)) 
4 

Есть, вероятно, и другие способы, но почему бы не использовать Python встроенных в знании того, что последовательность байт b'\\xaf' может быть разобрана в массив байт?

+0

Использование библиотек 'request' и' urllib.request' было одинаковым, так что вопрос действительно был, как удалить обратную косую черту из строки. И ты ответил на этот вопрос, как я мог надеяться! Это действительно удобный инструмент, 'ast.literal_eval()', который я пока не наткнулся, до сих пор. Спасибо! Я думаю, что я понял, как работает этот ввод, но я еще не уверен, зачем мне нужна эта дополнительная '' 'вокруг моей строки, не могли бы вы просветить меня? Еще раз спасибо! (Я не могу выдвинуть свою кандидатуру, потому что я новичок) – Jayus

+1

Это довольно сложно - мне пришлось сначала проработать несколько версий, прежде чем заставить его работать. В принципе, аргумент 'literal_eval' должен быть тем, что имеет смысл вводить в приглашение Python или помещать в исходный код. Но вы все равно должны иметь смысл в самом источнике, поэтому вам (свободно говоря) нужен дополнительный слой буквальной кодировки. Вам нужно передать строковый объект 'literal_eval', который сам представляет строковый объект. '" b% s "% test' оценивает' 'b'BZh ... '" ', который сам является литералом, представляющим массив байтов' b'BZh ...' '. –

0

Вот это solution:

import urllib 
import bz2 
import re 

def decode(line): 
    out = re.search(r"\'(.*?)\'",''.join(line)).group() 
    out = eval("b%s" % out) 
    return bz2.decompress(out) 

#read lines that contain the encoded message 
page = urllib.urlopen('http://www.pythonchallenge.com/pc/def/integrity.html').readlines()[20:22] 

print "Click on the bee and insert: " 
User_Name = decode(page[0]) 
print "User Name is: " + User_Name 
Password = decode(page[1]) 
print "Password is: " + Password 
Смежные вопросы