почему b '(а иногда и b' ') появляется, когда я разделяю какой-то источник HTML [Python] - PullRequest
2 голосов
/ 12 ноября 2011

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

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

import urllib.request

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

print(HTML_source)

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

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

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

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

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

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

Ответы [ 2 ]

7 голосов
/ 12 ноября 2011

Префикс "b" означает, что типом является байт , а не 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 голосов
/ 12 ноября 2011

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...