#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].