почему b’ (и иногда b ‘ ‘) отображается, когда я разделяю некоторый HTML-источник [Python]

#python #parsing #python-3.x

#python #Синтаксический анализ #python-3.x

Вопрос:

Я довольно новичок в 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-источник somelink, однако он добавляет к нему префикс b’
например

 b'<HTML>rn<HEAD> (etc). . . .
  

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

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

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

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

Ответ №1:

Префикс «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:

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

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

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

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