>>> tree = et.ElementTree(file='menu.xml')
>>> root = tree.getroot()
>>> root.tag
'menu'
>>> for child in root:
…·····print('tag:', child.tag, 'attributes:', child.attrib)
·····for grandchild in child:
…·········print('\ttag:', grandchild.tag, 'attributes:', grandchild.attrib)
…
tag: breakfast attributes: {'hours': '7-11'}
····tag: item attributes: {'price': '$6.00'}
····tag: item attributes: {'price': '$4.00'}
tag: lunch attributes: {'hours': '11-3'}
····tag: item attributes: {'price': '$5.00'}
tag: dinner attributes: {'hours': '3-10'}
····tag: item attributes: {'price': '8.00'}
>>> len(root)·····# количество разделов menu
3
>>> len(root[0])··# количество элементов breakfast
2
Для каждого элемента вложенных списков tag — это строка тега, а attrib — это словарь его атрибутов. Библиотека ElementTree имеет множество других способов поиска данных, организованных в формате XML, модификации этих данных и даже записи XML-файлов. Все детали изложены в документации библиотеки ElementTree (http://bit.ly/elementtree).
Среди других библиотек для работы с XML в Python можно отметить следующие:
• xml.dom. The Document Object Model (DOM), знакомая разработчикам на JavaScript, представляет веб-документы как иерархические структуры. Этот модуль загружает XML-файл в память целиком и позволяет вам получать доступ ко всем его частям;
• xml.sax. Simple API for XML, или SAX, разбирает XML на ходу, поэтому он не загружает в память сразу весь документ. Он может стать хорошим выбором, если вам нужно обработать очень большие потоки XML.
HTML
Огромные объемы данных сохраняются в формате гипертекстового языка разметки (Hypertext Markup Language, HTML), это основной формат документов в сети Интернет. Проблема заключается в том, что значительная часть этих документов не соответствует правилам формата HTML, поэтому его трудно разобрать. Помимо этого, большая часть HTML предназначена для того, чтобы форматировать выводимую информацию, а не обмениваться данными. Поскольку эта глава предназначена для того, чтобы описать относительно хорошо определенные форматы данных, я вынес рассмотрение HTML в главу 9.
JSON
JavaScript Object Notation (JSON) (http://www.json.org/) стал очень популярным форматом обмена данными, вышедшим за пределы языка JavaScript. Формат JSON является частью языка JavaScript и часто содержит легальный с точки зрения Python синтаксис. Он хорошо подходит Python, что делает его хорошим выбором при определении формата данных для обмена между программами. Вы увидите множество примеров использования JSON при веб-разработке в главе 9.
В отличие от XML, для которого написано множество модулей, для JSON существует всего один модуль с простым именем json. Эта программа кодирует (выгружает) данные в строку JSON и декодирует (загружает) строку JSON обратно. В следующем примере мы создадим структуру данных, содержащую данные из предыдущего примера, где описывался формат XML:
>>> menu = \
… {
… "breakfast": {
…·········"hours": "7-11",
…·········"items": {
…·················"breakfast burritos": "$6.00",
…·················"pancakes": "$4.00"
…·················}
…·········},
… "lunch": {
…·········"hours": "11-3",
…·········"items": {
…·················"hamburger": "$5.00"
…·················}
…·········},
… "dinner": {
…·········"hours": "3-10",
…·········"items": {
…·················"spaghetti": "$8.00"
…·················}
…·········}
… }
.
Далее закодируем структуру данных (menu) в строку JSON (menu_json) с помощью функции dumps():
>>> import json
>>> menu_json = json.dumps(menu)
>>> menu_json
'{"dinner": {"items": {"spaghetti": "$8.00"}, "hours": "3-10"},
"lunch": {"items": {"hamburger": "$5.00"}, "hours": "11-3"},