реклама
Бургер менюБургер меню

Кеннет Рейтц – Автостопом по Python (страница 59)

18

PyPI вернул текст в формате JSON. Не существует правила, которое регулирует формат отправляемых данных, но во многих API используются JSON или XML.

Анализ JSON. Нотация объектов Javascript (Javascript Object Notation, JSON) полностью соответствует своему имени: используется для определения объектов в JavaScript. Библиотека Requests имеет встроенный анализатор JSON в объектах типа Response.

Библиотека json (https://docs.python.org/3/library/json.html) может анализировать JSON, расположенный в строках или файлах, и помещать его в словарь Python (или список, если это вам так удобнее). Она также преобразует словари или списки Python в строки JSON. Например, в следующей строке содержатся данные JSON:

json_string = '{"first_name": "Guido", "last_name":"van Rossum"}'

Проанализировать ее можно следующим образом:

import json

parsed_json = json.loads(json_string)

Теперь вы можете использовать эти данные как словарь:

print(parsed_json['first_name'])

"Guido"

Вы также можете преобразовать следующий словарь в JSON:

d = {

····'first_name': 'Guido',

····'last_name': 'van Rossum',

····'titles': ['BDFL', 'Developer'],

}

print(json.dumps(d))

'{"first_name": "Guido", "last_name": "van Rossum",

··"titles": ["BDFL", "Developer"]}'

Библиотека json была добавлена в Python 2.6. Если вы используете более раннюю версию Python, можете загрузить из PyPI библиотеку simplejson (https://simplejson.readthedocs.org/en/latest/).

simplejson предоставляет такой же API, как и модуль стандартной библиотеки json, но обновляется чаще, чем Python. Разработчики, работающие с более старыми версиями Python, все еще могут использовать функциональность, доступную в библиотеке json, импортировав simplejson. Вы можете выбрать simplejson как полноценную замену для json следующим образом:

import simplejson as json

После импортирования библиотеки simplejson под именем json все предыдущие примеры будут работать так же, как если бы вы использовали стандартную библиотеку json.

Анализ XML

В стандартной библиотеке есть анализатор XML (методы parse() и fromstring() класса xml.etree.ElementTree), но this использует библиотеку Expat и создает объект ElementTree, сохраняющий структуру XML. Это значит, что требуется итерировать по нему и опрашивать потомков, дабы получить содержимое. Если нужно лишь получить данные, обратитесь к untangle или xmltodict. Вы можете установить их командой pip:

$ pip install untangle

$ pip install xmltodict

• untangle (https://github.com/stchris/untangle). Принимает документ XML и возвращает объект Python, чья структура отражает узлы и атрибуты документа. Например, такой файл XML:

<?xml version="1.0" encoding="UTF-8"?>

<root>

····<child name="child1" />

</root>

можно загрузить следующим образом:

import untangle

obj = untangle.parse('path/to/file.xml')

можно получить имя элемента-потомка:

obj.root.child['name'] # is 'child1'

• xmltodict (http://github.com/martinblech/xmltodict). Преобразует XML в словарь. Например, такой файл XML:

<mydocument has="an attribute">

··<and>

····<many>elements</many>

····<many>more elements</many>

··</and>

··<plus a="complex">

····element as well

··</plus>

</mydocument>

можно загрузить в объект типа OrderedDict (из модуля collections стандартной библиотеки Python):

import xmltodict

with open('path/to/file.xml') as fd: doc = xmltodict.parse(fd.read())

можно получить доступ к элементам, атрибутам и значениям:

doc['mydocument']['@has'] # is u'an attribute'

doc['mydocument']['and']['many'] # is [u'elements', u'more elements']

doc['mydocument']['plus']['@a'] # is u'complex'

doc['mydocument']['plus']['#text'] # is u'element as well'

С помощью xmltodict можно преобразовать словарь обратно в XML, вызвав функцию unparse(). Она имеет потоковый режим, подходящий для обработки файлов, не помещающихся в память, а также поддерживает пространства имен.

Скраппинг сайтов

Сайты не всегда предлагают данные в удобных форматах вроде CSV или JSON, но HTML представляет собой структурированные данные — здесь вступает в дело скраппинг.

Скраппинг сайтов — это использование компьютерной программы для анализа веб-страницы и сбора необходимых данных в формате, наиболее удобном для вас (при этом сохраняя их структуру).

По мере того как сайты предлагают свои API, они явно просят вас не использовать скраппинг: API открывает вам доступ только к тем данным, которыми владельцы сайта желают поделиться. Перед тем как начать скраппинг, прочтите условия использования целевого сайта и будьте законопослушным гражданином.

lxml

lxml (http://lxml.de/) — это довольно обширная библиотека, написанная для выполнения быстрого анализа документов XML и HTML. Позволяет обрабатывать некоторый объем некорректной разметки.

Загрузите ее с помощью pip:

$ pip install lxml