
[ Россум, Дрейк, Откидач ] Язык программирования Python
.pdf28.5. xdrlib — представление данных в формате XDR |
381 |
unpack_uint()
unpack_int()
unpack_enum()
unpack_bool()
unpack_uhyper()
unpack_hyper()
unpack_float()
unpack_double()
Интерпретирует данные в буфере как XDR-представление значения соответствующего простого типа и возвращает распакованное значение.
unpack_fstring(n)
unpack_fopaque(n)
Интерпретирует данные в буфере как XDR-представление строки фиксированной длины n. Ожидается, что представление строки дополнено нулевыми байтами для обеспечения выравнивания к 4 байтам. Возвращает распакованное значение в виде строки.
unpack_string()
unpack_opaque()
unpack_bytes()
Интерпретирует данные в буфере как XDR-представление строки переменной длины. Ожидается, что длина строки упакована в виде целого беззнакового числа. Возвращает распакованное значение в виде строки.
unpack_list(unpack_item)
Интерпретирует данные в буфере как XDR-представление последовательности неизвестной длины. Ожидается, что перед каждым элементом последовательности упакована 1 в виде целого беззнакового, а в конце последовательности упакован 0. Для распаковки элементов последовательности использует метод (функцию) unpack_item, распакованную последовательность возвращает в виде списка.
unpack_farray(n, unpack_item)
Интерпретирует данные в буфере как XDR-представление последовательности фиксированной длины n. Для распаковки элементов последовательности использует метод (функцию) unpack_item, распакованную последовательность возвращает в виде списка.
unpack_array(unpack_item)
Интерпретирует данные в буфере как XDR-представление последовательности переменной длины. Ожидается, что длина последовательности упакована в виде целого беззнакового числа. Для распаковки элементов последовательности использует метод (функцию) unpack_item, распакованную последовательность возвращает в виде списка.
Модуль также определяет иерархию исключений:
382 |
Глава 28. Поддержка форматов, используемых в Internet |
Error
Базовый класс для всех исключений модуля. Его экземпляры имеют один публичный атрибут данных msg, содержащий пояснение к ошибке.
ConversionError
Исключения этого класса генерируются методами unpack_*() экземпляров класса Unpacker, если данные в буфере с XDR-представлением не соответствуют ожидаемому формату, и методами pack_*() класса Packer, если указанное значение не может быть упаковано данным методом.

383
Глава 29
Средства работы с языками структурной разметки
Модули, описанные в этой главе, предоставляют средства для работы с различными языками структурной разметки: SGML (Standard Generalized Markup Language, стандартный язык обобщенной разметки), HTML (Hypertext Markup Language, язык разметки гипертекста) и XML (Extensible Markup Language, расширяемый язык разметки).
sgmllib |
Минимальные средства работы с SGML (то, что необходимо |
|
для обработки HTML). |
htmllib |
Обработка HTML-документов. |
htmlentitydefs |
Определения сущностей HTML. |
xml.parsers.expat |
Быстрая обработка XML-документов (без проверки на соот- |
|
ветствие DTD) с помощью библиотеки Expat языка C. |
xml.sax |
SAX2 интерфейс к синтаксическим анализаторам XML- |
|
документов. |
xml.sax.handler |
Базовые классы для обработчиков SAX-событий. |
xml.sax.saxutils |
Вспомогательные средства для приложений, использующих |
|
SAX. |
xml.sax.xmlreader |
Интерфейс объектов, реализующих преобразование XML- |
|
документов в поток SAX-событий. |
xmllib |
Обработка XML-документов. |
29.1 sgmllib — обработка SGML-документов
Этот модуль определяет класс SGMLParser, реализующий обработку текста в формате SGML (Standard Generalized Markup Language, стандартный язык обобщенной разметки). На самом деле он воспринимает только ту часть синтаксиса SGML, которая используется в HTML (модуль sgmllib служит базой для модуля htmllib).
SGMLParser()
384 |
Глава 29. Средства работы с языками структурной разметки |
Возвращает объект, реализующий обработку текста в формате SGML. Воспринимаются следующие конструкции:
Открывающие и закрывающие теги в виде ‘<ФЕЗ БФТЙВХФ="ЪОБЮЕОЙЕ"...>’ и ‘</ÔÅÇ>’ соответственно.
Ссылки на символы в виде ‘ËÏÄ;’.
Ссылки на сущности (entity) в виде ‘&ÉÍÑ;’.
Комментарии в виде ‘<!--ФЕЛУФ-->’.
Экземпляры класса SGMLParser имеют следующие интерфейсные методы (переопределяя эти методы в производных классах, Вы контролируете обработку размеченного текста, то есть, определяете тип документа — DTD):
reset()
Возвращает экземпляр в исходное состояние. Все необработанные данные теряются. Этот метод неявно вызывается при инициализации.
setnomoretags()
Останавливает обработку тегов. Весь последующий текст воспринимается без обработки (CDATA). Этот метод необходим для реализации обработки тега ‘<PLAINTEXT>’ в HTML.
setliteral()
Временно приостанавливает обработку тегов. Последующий текст воспринимается без обработки (CDATA).
feed(data)
Передает экземпляру размеченный текст data для обработки. Обрабатываются только завершенные данные, остальное остается в буфере до тех пор, пока не будет передана следующая порция данных или не будет вызван метод close().
close()
Завершает обработку всех данных в буфере. Вы можете переопределить этот метод в производном классе, добавив дополнительные действия. Переопределенный метод всегда должен вызывать исходную версию метода.
get_starttag_text()
Возвращает текст последнего открывающего тега. Этот метод может быть полезен для регенерации исходного размеченного текста с минимальными изменениями.
handle_starttag(tag, method, attributes)
Вызывается для обработки открывающих тегов, для которых определен метод start_tag() или do_tag(). Аргумент tag является строкой с именем тега, приведенном к нижнему регистру, method — метод, который должен быть вызван для интерпретации открывающего тега. Атрибут attributes является списком пар ‘(name, value)’ для всех атрибутов, найденных внутри угловых скобок тега, где name — имя атрибута, приведенное к нижнему регистру, и value — его значение. Исходная реализация этого метода вызывает method(attributes).
29.1. sgmllib — обработка SGML-документов |
385 |
handle_endtag(tag, method)
Вызывается для обработки закрывающих тегов, для которых определен метод end_tag(). Аргумент tag является строкой с именем тега, приведенном к нижнему регистру, method — метод, который должен быть вызван для интерпретации закрывающего тега. Исходная реализация этого метода просто вызывает method().
handle_data(data)
Вызывается для обработки простого текста. Вам следует переопределить его в производном классе: исходная реализация ничего не делает.
handle_charref(ref)
Вызывается для обработки ссылок на символы в виде ‘ref;’. Исходная реализация преобразует число в диапазоне от 0 до 255 в символ с помощью встроенной функции chr() и вызывает с ним метод handle_data(). Если аргумент ref неверен или выходит за пределы указанного диапазона, вызывает unknown_charref(ref) для обработки ошибки.
handle_entityref(ref)
Вызывается для обработки ссылок на сущности в виде ‘&ref;’. Исходная реализация использует атрибут экземпляра (или класса) entitydefs, являющийся отображением имен сущностей к строкам. Если это отображение содержит запись с ключом ref, вызывает метод handle_data() с результатом в качестве аргумента, в противном случае вызывает unknown_entityref(ref). По умолчанию атрибут entitydefs содержит записи с ключами ’amp’, ’apos’, ’gt’, ’lt’ и ’quot’.
handle_comment(comment)
Вызывается для обработки комментария. В качестве аргумента comment используется строка с текстом, содержащимся между ‘<!--’ и ‘-->’. Исходная реализация ничего не делает.
report_unbalanced(tag)
Этот метод вызывается, если в размеченном тексте найден закрывающий тег tag, для которого не было открывающего тега.
unknown_starttag(tag)
Вызывается для обработки неизвестного открывающего тега (если нет соответствующего метода start_tag() или do_tag()). Вам следует переопределить этот метод в производном классе: исходная реализация ничего не делает.
unknown_endtag(tag)
Вызывается для обработки неизвестного закрывающего тега (если нет соответствующего метода end_tag()). Вам следует переопределить этот метод в производном классе: исходная реализация ничего не делает.
unknown_charref(ref)
Вызывается для обработки неверной ссылки на символ в виде ‘ref;’ (см. описание метода handle_charref()). Вам следует переопределить этот метод в производном классе: исходная реализация ничего не делает.

386 |
Глава 29. Средства работы с языками структурной разметки |
unknown_entityref(ref)
Вызывается для обработки ссылки на сущность с неизвестным именем в виде ‘&ref;’ (см. описание метода handle_entityref()). Вам следует переопределить этот метод в производном классе: исходная реализация ничего не делает.
Помимо переопределения некоторых из перечисленных выше методов, в производных классах Вам следует определить методы для обработки тегов. Имена тегов в размеченном тексте могут содержать буквы в любом регистре: перед вызовом метода имя будет приведено к нижнему регистру (то есть tag в именах методов, описанных ниже, является именем тега, приведенного к нижнему регистру). В качестве атрибута attributes используется список пар ‘(name, value)’ для всех атрибутов, найденных внутри угловых скобок тега, где name — имя атрибута, приведенное к нижнему регистру, и value — его значение.
start_tag(attributes)
Вызывается для обработки открывающего тега tag. Этот метод имеет преимущество над методом do_tag().
do_tag(attributes)
Вызывается для обработки открывающего тега tag, для которого не должно быть соответствующего закрывающего тега.
end_tag()
Вызывается для обработки закрывающего тега tag.
Обработчик хранит стек открытых элементов, для которых еще не было закрывающих тегов. В этот стек помещаются только теги, для которых есть соответствующий метод start_tag(). Определение метода end_tag() не является обязательным. Для тегов, обрабатываемых методами do_tag() и unknown_tag() нет смысла определять соответствующие методы end_tag() — они не будут использованы.
29.2htmllib — обработка HTML-документов
Этот модуль определяет класс HTMLParser (производный от sgmllib.SGMLParser), который может быть использован в качестве базового для класса, реализующего обработку текста в формате HTML (Hypertext Markup Language, язык разметки гипертекста). В настоящий момент этот класс поддерживает HTML 2.01. Для получения вывода экземпляры HTMLParser и производных от него классов вызывают методы указанного объекта, реализующего форматирование текста. Стандартный модуль formatter предоставляет два варианта таких объектов (смотрите описание модуля для получения информации об интерфейсе объектов, реализующих форматирование).
1http://www.w3.org/hypertext/WWW/MarkUp/html-spec/html-spec_toc.html
29.2. htmllib — обработка HTML-документов |
387 |
HTMLParser(formatter)
Создает и возвращает объект, реализующий обработку текста в формате HTML. Этот класс поддерживает все имена сущностей, требуемых спецификацией HTML 2.0 (определены в модуле htmlentitydefs), и определяет обработчики для всех элементов HTML 2.0 и многих элементов HTML 3.0 и 3.2.
В дополнение к методам, реализующий обработку тегов (как того требует интерфейс класса sgmllib.SGMLParser), класс HTMLParser предоставляет следующие дополнительные методы и атрибуты данных:
formatter
Объект, реализующий форматирование текста, который был передан в качестве аргумента при инициализации.
nofill
Если этот флаг является ложью, идущие друг за другом символы пропуска будут свернуты в один пробел методом handle_data() или save_end(), в противном случае будут оставлены без изменений. Обычно он должен быть истинным только внутри элемента <pre>.
anchor_bgn(href, name, type)
Вызывается в начале региона, помеченного якорем. В качестве аргументов используются значения одноименных атрибутов тега <a> (если тег не содержит какоголибо атрибута, в качестве аргумента для него используется пустая строка). Исходная реализация сохраняет все ссылки, содержащиеся в документе, в списке, доступном через атрибут anchorlist.
anchor_end()
Вызывается в конце региона, помеченного якорем. Исходная реализация добавляет текстовую ссылку в виде ‘[index]’, где index — индекс соответствующего элемента в списке ссылок (атрибут anchorlist).
handle_image(src, alt [, ismap [, align [, width
[, height]]]])
Вызывается для обработки вставок изображений. В качестве аргументов используются значения одноименных атрибутов тега <img> (аргументы width и height являются целыми числами). Исходная реализация вызывает handle_data(alt).
save_bgn()
Устанавливает режим, в котором все символьные данные сохраняются во внутреннем буфере вместо того, чтобы быть переданными объекту, реализующему форматирование (аргумент formatter конструктора). Вы можете извлечь сохраненные данные с помощью метода save_end().
save_end()
Заканчивает работу в режиме, в котором все символьные данные сохраняются во внутреннем буфере, и возвращает все сохраненные данные. Если атрибут nofill является ложью, последовательности символов пропуска заменяются одним пробелом.

388 |
Глава 29. Средства работы с языками структурной разметки |
29.3 htmlentitydefs — определения сущностей HTML
Этот модуль определяет один словарь, который используется модулем htmllib в качестве значения атрибута entitydefs класса htmllib.HTMLParser. Этот словарь содержит записи для всех сущностей (entity) HTML 2.0, отображая их имена в символы
вкодировке Latin-1 (ISO-8859-1). Сущности, которые не могут быть представлены литерально в рамках Latin-1, отображаются в запись вида ‘ref;’, где ref — код символа
вUnicode.
entitydefs
Словарь, отображающий имена сущностей HTML 2.0 в символ кодировки Latin-1 или ссылку на символ Unicode в виде ‘ref;’.
29.4xml.parsers.expat — быстрая обработка XMLдокументов с помощью библиотеки Expat
Модуль xml.parsers.expat доступен, начиная с версии 2.0 и предоставляет интерфейс библиотеке Expat, реализующей быструю обработку XML-документов без проверки на соответствие DTD2. Модуль определяет следующие две функции, исключение и подмодуль:
ErrorString(err_code)
Возвращает строку с пояснением к ошибке с кодом err_code.
ParserCreate([encoding [, namespace_separator]])
Создает и возвращает объект, реализующий обработку текста в формате XML. Если задан и не равен None, он должен быть строкой, указывающей кодировку: ’UTF-8’, ’UTF-16’ или ’ISO-8859-1’ (по умолчанию обработчик автоматически выбирает между UTF-8 и UTF-16).
Если задан и не равен None аргумент namespace_separator (должен быть строкой из одного символа), включается обработка пространств имен. В этом случае имена элементов и атрибутов, определенных в каком-либо пространстве имен, будут передаваться функциям StartElementHandler() и EndElementHandler() в виде ‘namespace_URI + namespace_separator + name’, где namespace_URI — URI пространства имен и name — имя элемента или атрибута. Если аргумент namespace_separator равен ’\000’, в качестве разделителя используется пустая строка.
Например, пусть в качестве аргумента namespace_separator используется ’ ’ и обрабатывается следующий документ:
2Модуль xml.parsers.expat является надстройкой над модулем pyexpat. Использовать модуль pyexpat напрямую не рекомендуется.
29.4. xml.parsers.expat — быстрая обработка . . . |
389 |
||
<?xml |
version="1.0"?> |
|
|
<root |
xmlns |
= "http://default-namespace.org/" |
|
xmlns:py = "http://www.python.org/ns/"> <py:elem1 />
<elem2 xmlns="" /> </root>
В этом случае функция StartElementHandler() получит следующие строки в качестве аргументов:
http://default-namespace.org/ root http://www.python.org/ns/ elem1 elem2
error
Исключения этого класса генерируются, если XML-документ содержит ошибки.
errors
Подмодуль, в котором определены константы вида XML_ERROR_* для возможных ошибок обработки. Вы можете использовать их для сравнения со значением атрибута ErrorCode объектов, возвращаемых функцией-конструктором
ParserCreate().
XMLParserType
Тип объектов, возвращаемых функцией ParserCreate().
Объекты, возвращаемые функцией-конструктором ParserCreate(), имеют следующие методы:
Parse(data [, isfinal])
Обрабатывает содержимое строки data, вызывая соответствующие функции. При последнем вызове аргумент isfinal должен являться истиной.
ParseFile(file)
Считывает данные из файла, представленного файловым или подобным объектом file (должен поддерживать вызов метода read() с одним аргументом, возвращающим пустую строку, если больше нет данных).
SetBase(base)
Устанавливает базовый адрес, который должен быть использован для относительных URI в системных объявлениях: он будет передан в качестве аргумента base функциям ExternalEntityRefHandler, NotationDeclHandler и UnparsedEntityDeclHandler.
GetBase()
Возвращает строку с базовым адресом, установленным ранее с помощью метода SetBase(), или None, если метод SetBase() не был использован.
Объекты, возвращаемые функцией-конструктором ParserCreate(), имеют следующие атрибуты:
390 |
Глава 29. Средства работы с языками структурной разметки |
returns_unicode
Если этот атрибут равен 1 (по умолчанию), функциям-обработчикам, описанным ниже, будут передаваться строки Unicode, если же он равен 0 — обычные строки, содержащие данные в кодировке UTF-8. Вы можете изменять значение этого атрибута в любое время, задавая таким образом тип результата.
Значения следующих атрибутов относятся к последней ошибке. Эти атрибуты имеют корректные значения только после того, как метод Parse() или ParseFile() сгенерировал исключение error.
ErrorByteIndex
Индекс (в байтах), указывающий на место, в котором возникла ошибка.
ErrorCode
Числовой код ошибки. Вы можете использовать это значение в качестве аргумента функции ErrorString() или сравнивать его со значениями констант, определенных в подмодуле errors.
ErrorColumnNumber
Позиция в строке, в которой возникла ошибка.
ErrorLineNumber
Номер строки, в которой возникла ошибка.
Ниже приведен список обработчиков, которые Вы можете установить для объекта obj с помощью инструкций вида ‘obj.handler = func’, где handler должен быть одним из перечисленных атрибутов и func — объектом, поддерживающим вызов с указанным количеством аргументов. Все аргументы, если не указано иного, являются строками.
StartElementHandler(name, attributes)
Вызывается для обработки открывающего тега каждого элемента. Аргумент name содержит имя элемента и attributes — словарь, отображающий имена атрибутов к их значениям.
EndElementHandler(name)
Вызывается для обработки закрывающего тега каждого элемента. Аргумент name содержит имя элемента.
ProcessingInstructionHandler(name, data)
Вызывается для каждой инструкции обработки (PI, Processing Instruction) в виде ‘<?name data?>’ (но не для ‘<?xml data?>’).
CharacterDataHandler(data)
Вызывается для обработки простого текста.
UnparsedEntityDeclHandler(entityName, base, systemId, publicId, notationName)
Вызывается для необрабатываемых объявлений сущностей (NDATA).