Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: OliverОтветов: 2

Я довольно новичок в 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 БЕЗ использования стороннего модуля. Я знаю весь этот бред о том, что нельзя изобретать велосипед и тому подобное, но я пытаюсь учиться, "создавая свои собственные инструменты".

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

pythonparsing

Ответы

Ответ 1 · рейтинг 8 · Raymond Hettinger

Префикс "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 по умолчанию.

Ответ 2 · рейтинг 2 · jfs

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

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

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

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы