справочник по Python. мм isbn 9785932861578 9 785932 861578
Скачать 4.21 Mb.
|
h.handle_data(data) Этот метод-обработчик вызывается для обработки данных, находящихся между открывающим и закрывающим тегами. В аргументе data передает- ся строка с текстом. h.handle_decl(decl) Этот метод-обработчик вызывается для обработки объявлений, таких как ‘’ . В аргументе decl передается строка с текстом объяв- ления, за исключением начальной последовательности символов ‘ вершающего символа ‘>’. h.handle_endtag(tag) Этот метод-обработчик вызывается, когда встречается закрывающий тег. В аргументе tag передается имя тега, в котором все символы преобразова- ны в нижний регистр. Например, при встрече закрывающего тега ‘ 698 Глава 24. Обработка и представление данных в Интернете ка с именем тега. В аргументе attrs передается информация об атрибутах в виде списка кортежей вида (name, value), где name – имя атрибута, содер- имя атрибута, содер- атрибута, содер- атрибута, содер- , содер- содер- жащее только символы нижнего регистра, а value – значение атрибута. При извлечении значений кавычки и мнемоники замещаются. Например, при встрече тега ‘’ в аргументе tag будет передана строка ‘a’, а в аргументе attrs – список [(‘href’,’http://www.foo.com’)]. Если этот метод не переопределен в производном классе, реализация по умолча- нию просто вызывает методы handle_starttag() и handle_endtag(). h.handle_starttag(tag, attrs) Этот метод-обработчик вызывается, когда встречается открывающий тег вида ‘ h.reset() Сбрасывает парсер в исходное состояние, уничтожает все необработанные данные. Модуль HTMLParser определяет следующее исключение: HTMLParserError Это исключение возбуждается в результате появления ошибок при синтак- сическом анализе. Экземпляр исключения HTMLParserError обладает тремя атрибутами. Атрибут msg содержит сообщение с описанием ошибки, атри- бут lineno – номер строки, где возникла ошибка, и атрибут offset – номер символа в строке. Пример Следующий пример получает страницу HTML, используя для этого пакет urllib , и выводит все ссылки вида ‘’: # printlinks.py try: from HTMLParser import HTMLParser from urllib2 import urlopen except ImportError: from html.parser import HTMLParser from urllib.request import urlopen import sys ёёё class PrintLinks(HTMLParser): def handle_starttag(self,tag,attrs): if tag == ‘a’: for name,value in attrs: if name == ‘href’: print(value) ёёё p = PrintLinks() u = urlopen(sys.argv[1]) data = u.read() charset = u.info().getparam(‘charset’) # Python 2 #charset = u.info().get_content_charset() # Python 3 p.feed(data.decode(charset)) p.close() Модуль json 699 В этом примере важно отметить, что разметка HTML, получаемая с помо- HTML, получаемая с помо- , получаемая с помо- щью пакета urllib , возвращается в виде строки байтов. Чтобы выполнить синтаксический анализ, эту строку байтов следует декодировать в текст, в соответствии с кодировкой символов, используемой в документе. Пример демонстрирует, как определить кодировку в Python 2 и в Python 3. Примечание Модуль HTMLParser имеет достаточно ограниченные возможности синтаксическо- го анализа. Слишком сложная разметка HTML или разметка с ошибками оформле- HTML или разметка с ошибками оформле- или разметка с ошибками оформле- ния может привести к ошибке в парсере и невозможности полного синтаксиче- ского анализа. Кроме того, пользователи считают, что этот модуль слишком низ- коуровневый и потому недостаточно удобный. Если вам необходим инструмент, с помощью которого можно было бы извлекать данные из страниц HTML, обратите внимание на пакет Beautiful Soup (http://pypi.python.org/pypi/BeautifulSoup). Модуль json Модуль json используется для преобразования объектов в последователь- ную форму представления и обратно с использованием нотации объектов JavaScript (JavaScript Object Notation, JSON). Более подробную информа- цию о формате JSON можно найти на странице http://json.org. 1 В действи- тельности этот формат является всего лишь подмножеством синтаксиса языка JavaScript. Но в данном случае он не соответствует синтаксису язы- ка Python, используемому для представления списков и словарей. Напри- мер, массив в формате JSON записывается как [value1, value2, ... ], а объ- ект – как {name:value, name:value, .... }. Ниже перечислены типы данных в формате JSON и соответствующие им типы данных в языке Python. Типы данных в языке Python, указанные в круглых скобках, допускается использовать при преобразовании в фор- мат JSON, но они не возвращаются при обратном преобразовании (возвра- щается объект первого типа в списке). Тип JSON Тип Python object dict array list (tuple) string unicode (str, bytes) number int, float true True false False null None 1 На русском языке: http://www.json.org/json-ru.html. – Прим. перев. 700 Глава 24. Обработка и представление данных в Интернете При работе со строковыми данными следует исходить из предположения, что все они представлены строками Юникода. Если потребуется преобразо- вать строку байтов, ее следует декодировать в строку Юникода, используя кодировку ‘utf-8’ по умолчанию (впрочем, этим преобразованием вполне можно управлять). При преобразовании строк из формата JSON всегда воз- JSON всегда воз- всегда воз- вращаются строки Юникода. Для преобразования в формат JSON и обратно используются следующие функции: dump(obj, f, **opts) Преобразует объект obj в формат JSON и сохраняет его в объекте f, похожем на файл. В opts передается коллекция именованных аргументов, управля- ющих процессом преобразования: Именованный аргумент Описание skipkeys Логический флаг, который определяет, что следует делать, когда в качестве ключей (не значений) словаря используются значе- ния не простых типов, таких как строки или числа. Если имеет значение True, такие ключи будут пропускаться. Если имеет значение False (по умолчанию), будет возбуждаться исключение TypeError ensure_ascii Логический флаг, который определяет, могут ли строки Юни- кода записываться в файл f. По умолчанию принимает значение False . Этот флаг следует устанавливать в значение True, только если аргумент f представляет объект файла, который корректно работает с Юникодом, например объект файла, созданный с по- мощью модуля codecs или открытый с определенными настрой- ками кодировки. check_circular Логический флаг, который определяет, следует ли проверять наличие циклических ссылок в контейнерах. По умолчанию по- лучает значение True. Если этот аргумент установлен в значение False и будет встречена циклическая ссылка, функция возбудит исключение OverflowError. allow_nan Логический флаг, который определяет, будут ли преобразовы- ваться числа с плавающей точкой, со значениями, находящи- мися за пределами представления (например, NaN, inf, -inf). По умолчанию принимает значение True. cls Подкласс класса JSONEncoder, используемый для преобразования. Этот аргумент следует указывать, если был создан собственный класс, производный от класса JSONEncoder, выполняющий пре- образование. Любые дополнительные именованные аргументы, которые передаются функции dump() , передаются конструктору этого класса. indent Неотрицательное целое число, которое определяет величину от- ступа при форматировании элементов массивов и атрибутов объ- ектов. Установка этого аргумента обеспечивает более удобочи- таемое представление. По умолчанию принимает значение None, что соответствует наиболее компактному представлению. Модуль json 701 Именованный аргумент Описание separators Кортеж вида (item_separator, dict_separator), где поле item_sepa- _sepa- sepa- rator является строкой с символами-разделителями, которые используются для отделения элементов массива, а поле dict_ separator – строкой с символами-разделителями, которые ис- пользуются для ключей и значений в словарях. По умолчанию принимают значение ( ‘, ‘, ‘: ‘ ). encoding Кодировка, используемая для преобразования строк Юникода. По умолчанию принимает значение ‘utf-8’. default Функция, используемая для сериализации объектов, которые не относятся ни к одному из основных поддерживаемых типов. Эта функция либо должна возвращать значение, пригодное для сериализации (например, строку), либо возбуждать исключение TypeError . По умолчанию для неподдерживаемых типов возбуж- дается исключение TypeError. dumps(obj, **opts) То же, что и dump(), за исключением того, что результат преобразования возвращается в виде строки. load(f, **opts) Принимает объект f, похожий на файл, с содержимым в формате JSON и возвращает результат преобразования в объект языка Python. В opts передается набор именованных аргументов, управляющих процессом пре- образования, которые описываются ниже. Важно помнить, что эта функ- ция вызывает метод f.read(), возвращающий содержимое файла f целиком. Поэтому данной функции не следует передавать такие потоки ввода, как сокеты, где данные в формате JSON могут составлять лишь часть объемно- JSON могут составлять лишь часть объемно- могут составлять лишь часть объемно- го или непрерывного потока данных. Именованный аргумент Описание encoding Кодировка, используемая при интерпретации всех строковых значений. По умолчанию используется кодировка ‘utf-8’ strict Логический флаг, который определяет, могут ли появляться в строках JSON литералы (неэкранированные) символов пере- вода строки. По умолчанию получает значение True, то есть при появлении таких литералов будет возбуждаться исключение. cls Подкласс класса JSONDecoder, используемый для преобразования. Этот аргумент следует указывать, если был создан собственный класс, производный от класса JSONDecoder, выполняющий пре- образование. Любые дополнительные именованные аргументы, которые передаются функции load() , передаются конструктору этого класса. 702 Глава 24. Обработка и представление данных в Интернете Именованный аргумент Описание object_hook Ф ункция, которая применяется к результату преобразования каждого объекта JSON. По умолчанию используется встроенная функция dict(). parse_float Функция, которая используется для декодирования значений с плавающей точкой в формате JSON. По умолчанию использу- JSON. По умолчанию использу- . По умолчанию использу- умолчанию использу- умолчанию использу- использу- использу- ется встроенная функция float(). parse_int Функция, которая используется для декодирования целочис- ленных значений в формате JSON. По умолчанию используется встроенная функция int(). parse_constant Функция, которая используется для декодирования констант JSON, таких как ‘NaN’, ‘true’, ‘false’ и других. loads(s, **opts) То же, что и load(), за исключением того, что данные в формате JSON пере- даются в виде строки s. Хотя эти функции называются точно так же, как функции в модулях pick- le и marshal, и они тоже используются для сериализации данных, тем не менее используются они совершенно иначе. В частности, функция dump() не должна использоваться для записи более одного объекта JSON в один и тот же файл. Точно так же функция load() не в состоянии прочитать бо- лее одного объекта JSON из одного и того же файла (если во входном фай- JSON из одного и того же файла (если во входном фай- из одного и того же файла (если во входном фай- ле будет храниться более одного объекта, в процессе его чтения возникнет ошибка). Объекты в формате JSON следует воспринимать так же, как до- JSON следует воспринимать так же, как до- следует воспринимать так же, как до- кументы HTML или XML. Ведь обычно ни у кого не возникает желания взять два совершенно разных документа XML и сохранить их в одном и том же файле. Если потребуется изменить порядок преобразования в формат JSON или обратно, это можно сделать, определив свой класс, производный от одного из следующих базовых классов: JSONDecoder(** opts) Класс, реализующий преобразование данных из формата JSON. В opts передается набор именованных аргументов, управляющих процессом пре- образования, назначение которых приводится в описании функции load(). Экземпляр d класса JSONDecoder обладает следующими двумя методами: d.decode(s) Возвращает представление объекта JSON на языке Python. В аргументе s передается строка с объектом JSON. d.raw_decode(s) Возвращает кортеж (pyobj, index), где в поле pyobj содержится представ- ление объекта JSON на языке Python, а в поле index – позиция в строке s, где заканчивается объект JSON. Это обстоятельство может использоваться (продолжение) Модуль mimetypes 703 при работе с потоками ввода, содержащими дополнительные данные, сле- дующие за объектом JSON. JSONEncoder(** opts) Класс, реализующий преобразование объекта на языке Python в формат JSON. В opts передается набор именованных аргументов, управляющих процессом преобразования, назначение которых приводится в описании функции dump(). Экземпляр e класса JSONEncoder обладает следующими методами: e.default(obj) Этот метод вызывается, когда объект obj на языке Python не может быть преобразован, если следовать обычным правилам преобразования. Дол- жен возвращать результат, который можно будет преобразовать в формат JSON (например, строку, список или словарь). e.encode(obj) Преобразует объект obj на языке Python в формат JSON. e.iterencode(obj) Создает итератор, который воспроизводит строки с представлением объек- та obj на языке Python в формате JSON по мере их составления. Процесс создания строки JSON имеет рекурсивную природу. Например, в процессе преобразования выполняются итерации по ключам словаря и обход других словарей и списков, найденных по пути. Используя этот метод, можно ор- ганизовать обработку результата по частям, в противоположность способу, когда полный результат возвращается в виде одной большой строки. При объявлении подклассов, производных от классов JSONDecoder и JSONEn- coder , где переопределяется метод __init__(), следует помнить о необходи- мости обработки именованных аргументов. Ниже показано, как это можно реализовать: class MyJSONDecoder(JSONDecoder): def __init__(self, **kwargs): # Извлечь мои собственные аргументы foo = kwargs.pop(‘foo’,None) bar = kwargs.pop(‘bar’,None) # Вызвать родительский метод, передав остальные именованные аргументы JSONDecoder.__init__(self,**kwargs) Модуль mimetypes Модуль mimetypes используется для определения типа MIME файла, исходя из расширения в имени файла. Он также позволяет получить стандартное расширение имени файла для того или иного типа MIME. Типы MIME со- MIME. Типы MIME со- . Типы MIME со- MIME со- со- стоят из пар тип/подтип, например: ‘text/html’, ‘image/png’ или ‘audio/mpeg’. guess_type(filename [, strict]) Определяет тип MIME файла, опираясь на имя файла или URL. Возвраща- MIME файла, опираясь на имя файла или URL. Возвраща- файла, опираясь на имя файла или URL. Возвраща- URL. Возвраща- . Возвраща- ет кортеж (type, encoding), где поле type содержит строку вида “тип/подтип”, 704 Глава 24. Обработка и представление данных в Интернете а поле encoding – название формата передаваемых данных (например, com- press или gzip). Возвращает (None, None), если тип определить не удалось. Если в аргументе strict передается значение True (по умолчанию), распо- знаваться будут только официальные типы MIME, зарегистрированные в IANA (http://www.iana.org/assignments/media-types). В противном случае будут распознаваться некоторые распространенные, но официально не за- регистрированные типы MIME. guess_extension(type [, strict]) Определяет расширение имени файла по указанному типу MIME. Возвра- MIME. Возвра- . Возвра- щает строку с расширением, включая начальный символ точки (.). Для не- известных типов возвращается значение None. Если в аргументе strict пере- дается значение True (по умолчанию), распознаваться будут только офици- альные типы MIME guess_all_extensions(type [, strict]) То же, что и guess_extension(), но возвращает список возможных расшире- ний имен файлов. init([files]) Инициализирует модуль. В аргументе files передается последовательность имен файлов с информацией о типах. Эти файлы содержат строки, отобра- жающие типы MIME в списки допустимых расширений имен файлов, на- MIME в списки допустимых расширений имен файлов, на- в списки допустимых расширений имен файлов, на- пример: image/jpeg: jpe jpeg jpg text/html: htm html ... read_mime_types(filename) Загружает отображение из файла с именем filename. Возвращает словарь, отображающий расширения имен файлов в строки с названиями типов MIME. Если указанный файл не существует или не может быть прочитан, возвращает None. add_type(type, ext |