почему b' (а иногда и b' ') появляется, когда я разделяю некоторый исходный код HTML[Python]

Я довольно новичок в Python и программировании в целом. Я сделал несколько руководств и примерно 2/3 прочитал довольно хорошую книгу. При этом я пытался освоиться с Python и программированием, просто пробуя что-то в стандартной библиотеке.

при этом я недавно столкнулся со странной причудой, которая, я уверен, является результатом моего собственного неправильного или не "питоновского" использования модуля urllib (с Python 3.2.2)

import urllib.request

HTML_source = urllib.request.urlopen(www.somelink.com).read()

print(HTML_source)

когда этот бит запускается через активный интерпретатор, он возвращает исходный HTML-код какой-либо ссылки, однако он добавляет к нему префикс b', например

b'<HTML>\r\n<HEAD> (etc). . . .

если я разобью строку на список с помощью пробела, перед каждым элементом будет стоять префикс b'

На самом деле я не пытаюсь сделать что-то конкретное, просто пытаюсь ознакомиться со стандартной библиотекой. Я хотел бы знать, почему это b' получает префикс

также бонус - есть ли лучший способ получить исходный код HTML БЕЗ использования стороннего модуля. Я знаю весь этот бред о том, что нельзя изобретать велосипед и тому подобное, но я пытаюсь учиться, «создавая свои собственные инструменты».

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


person Oliver    schedule 12.11.2011    source источник


Ответы (2)


Префикс "b" означает, что это тип bytes, а не str. Чтобы преобразовать байты в текст, используйте метод decode и назовите соответствующую кодировку. Кодировку часто можно найти в заголовке «Content-Type»:

>>> u = urllib.request.urlopen('http://cnn.com')
>>> u.getheader('Content-Type')
'text/html; charset=UTF-8'
>>> html = u.read().decode('utf-8')
>>> type(html)
<class 'str'>

Если вы не найдете кодировку в заголовках, попробуйте utf-8 по умолчанию.

person Raymond Hettinger    schedule 12.11.2011

b'' — это литеральный байтовый объект. В памяти нет b'' объектов, только bytes. Это просто обозначение байтовых объектов в вашем исходном коде. Простые кавычки '' в исходном коде создают объекты 'str' (строки Unicode).

Если объект bytes представляет собой текст (а не двоичные данные, такие как изображение), то, как правило, вы должны как можно скорее декодировать его в строку Unicode. Вы должны знать кодировку текста.

Парсеры HTML, такие как lxml.html, BeautifulSoup, могут конвертировать байты в Unicode без вашего вмешательства.

Если вы не знаете кодировку, то обнаружить ее может быть нетривиально, например, прочитайте как feedparser определяет кодировку символов [2006].

person jfs    schedule 12.11.2011