Приемы парсинга

В данной статье содержатся некоторые неочевидные приемы работы с парсером.

Задание пути к данным в xml-источнике регулярным выражением

Путь к необходимым данным внутри источника для их извлечения задается строкой. Для более гибкой настройки пути, эту строку можно задать регулярным выражением.

Пример использования:
 Необходимо с текущей страницы сайта извлечь все ссылки

Решение

Как известно, ссылки содержатся в атрибуте href тега a. Значит там необходимо выделить в источнике все теги a с атрибутом href и извлечь все значения этих атрибутов. Делается это так

x=xmlParser('http://www.cian.ru', 'html')
for i in x.getData(['.*/a'], get_attrib=True):
    if i[1] and 'href' in i[1]:
            print i[1]['href']

Генератор адресов доступа к xml источнику данных

Наиболее часто потребность такого генератора возникает при извлечении данных из html источников - сайтов в Интернете.

На одной странице сайта, как правило, хранится лишь небольшая порция информации. Чтобы собрать значительный объем данных, парсеру необходимо обойти множество страниц сайта и извлечь данные из каждой. Так вот, генератор адресов является одним из способов указать сайту множество адресов, которые ему необходимо обойти, чтобы извлечь данные. Идея генератора основана на том, что адреса на страницы с необходимыми данными имеют, как правило, одинаковую структуру и отличаются лишь отдельными элементами. Например, объявления о продаже однокомнатной или двухкомнатной квартиры в Москве сайта http://cian.ru находятся по адресу

http://www.cian.ru/cat.php?deal_type=sale&engine_version=2&offer_type=flat&region=1&room1=1&room2=1

о продаже аналогичных квартир в Санкт-Перербурге - по адресу

http://www.cian.ru/cat.php?deal_type=sale&engine_version=2&offer_type=flat&region=2&room1=1&room2=1

а в Ростове-на-Дону http://www.cian.ru/cat.php?deal_type=sale&engine_version=2&offer_type=flat&region=4606&room1=1&room2=1

Теперь практическая задача - указать парсеру адреса к спискам объявлений о продаже одно-, двух- и четырехкомнатных квартир в Москве, Санкт-Петербурге и Ростовской области. С помощью генератора адресов это делается так:

for link in ['http://www.cian.ru/cat.php?deal_type=sale&...&region=%(reg)s&room%(n)s=1' % {'reg':reg, 'n':n}
        for reg in ['1', '2', '4606']
          for n in xrange(1,5,1)
        ]:
        print link