Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 23, 2012 08:04:11

Seganapa
От: Новороссийск
Зарегистрирован: 2012-07-31
Сообщения: 139
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсинг Json при помощи Grab

В ответ на Get запрос сервер мне присылает страницу, в коде которой мне нужно спарсить данные в формате Json
Каким инструменотом Grab это удобнее сделать?

Вот часть кода страницы:

…………
{"phoenician_salesman_hint":false,"militia_hint":false,"player_protection_finished_hint":true,"build_time_reduction_hint":false,"age_of_wonder_hint":false,"display_new_year_hint":false,"world_ends_hint":false,"grepolympia_hint":false};
                                      Layout.militia_hint_shown = false;
                                      Layout.show_confirmation_popup = true;
                                      Layout.displayServerTime();
 
                                      ITowns.initialize({"groups":null,"towns":[{"id":694,"name":"55 Seganapa-7 F","island_x":537,"island_y":516,"plenty":"iron","rare":"wood","has_conqueror":false,"researches":{"berth":true,"conscription":true,"mathematics":true},"favor":500},{"id":57457,"name":"55 \u0421\u043f\u0430\u0440\u0442\u0430","island_x":537,"island_y":516,"plenty":"iron","rare":"wood","has_conqueror":false,"researches":{"berth":true,"conscription":true,"mathematics":true},"favor":500}],"tmpl":"<div class=\"box top left\">\n\t<div class=\"box top right\">\n\t\t<div class=\"box top center\"><\/div>\n\t<\/div>\n<\/div>\n<div class=\"box middle left\">\n\t<div class=\"box middle right\">\n\t\t<div class=\"
……………

Спарсить мне нужно то что находится между ITowns.initialize и “tmpl”, а дальше мне нужно будет использовать эти данные в коде…

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



—————————————————————–
Изучаю и параллельно использую Python 2.7

Отредактировано Seganapa (Авг. 23, 2012 08:24:39)

Офлайн

#2 Авг. 23, 2012 08:46:22

Seganapa
От: Новороссийск
Зарегистрирован: 2012-07-31
Сообщения: 139
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсинг Json при помощи Grab

Я нашел один способ:

f = g.rex_text('towns":(.+),"tmpl')

Он работает, но я сомневаюсь что он правильный?



—————————————————————–
Изучаю и параллельно использую Python 2.7

Отредактировано Seganapa (Авг. 23, 2012 09:36:37)

Офлайн

#3 Авг. 23, 2012 12:13:04

truporez
От:
Зарегистрирован: 2009-05-08
Сообщения: 266
Репутация: +  6  -
Профиль   Адрес электронной почты  

Парсинг Json при помощи Grab

не думали использовать модуль json?



Офлайн

#4 Авг. 23, 2012 12:46:26

Seganapa
От: Новороссийск
Зарегистрирован: 2012-07-31
Сообщения: 139
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсинг Json при помощи Grab

Я использую модуль json, после того как получаю эти данные…



—————————————————————–
Изучаю и параллельно использую Python 2.7

Офлайн

#5 Авг. 23, 2012 13:05:40

Seganapa
От: Новороссийск
Зарегистрирован: 2012-07-31
Сообщения: 139
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсинг Json при помощи Grab

Как такое может быть??? Вот фрагмент кода

for k in city:
    g.setup(headers = {'X-Requested-With'  :  'XMLHttpRequest'}, referer = 'http://ru8.grepolis.com/game/index?login=1')
    g.go('http://ru8.grepolis.com/game/index?action=switch_town&town_id=%s&h=%s&json={town_id:"%s","nlreq_id":%s}&_=%s' %(k['id'], token, k['id'], nlreq, timef))
    resource = g.rex_text('resources":(.*),"storage')
    print resource
Здесь с каждой итерацией я получаю ответ сервера и вытаскиваю из него кол-во ресурсов с помощью регулярки.

Так вот, каждый раз, когда я запускаю скрипт, мне возвращается ответ с ошибкой, но почти всегда на разном шаге цикла…

Например:
1 Запуск
pydev debugger: starting
{"wood":25500,"stone":25500,"iron":25500}
{"wood":25500,"stone":19244,"iron":25500}
{"wood":25500,"stone":25500,"iron":25500}
{"wood":25500,"stone":25500,"iron":25500}
{"wood":25500,"stone":25500,"iron":25500}
{"wood":25500,"stone":23435,"iron":25500}
{"wood":25500,"stone":23435,"iron":25500}
{"wood":25500,"stone":25500,"iron":25500}
{"wood":25500,"stone":25500,"iron":25500}
Traceback (most recent call last):
  File "C:\Python\eclipse-SDK-4.2-win32\eclipse\plugins\org.python.pydev_2.6.0.2012062818\pysrc\pydevd.py", line 1392, in <module>
    debugger.run(setup['file'], None, None)
  File "C:\Python\eclipse-SDK-4.2-win32\eclipse\plugins\org.python.pydev_2.6.0.2012062818\pysrc\pydevd.py", line 1085, in run
    pydev_imports.execfile(file, globals, locals) #execute the script
  File "C:\Users\Noutbook\workspace\proba\Seganapa3RU8.py", line 106, in <module>
    resource = g.rex_text('resources".*),"storage')
  File "C:\Python27\Lib\site-packages\grab-0.4.5-py2.7.egg\grab\ext\rex.py", line 28, in rex_text
    raise DataNotFound('Regexp not found')
grab.error.DataNotFound: Regexp not found

2 Запуск
pydev debugger: starting
{"wood":25500,"stone":25500,"iron":25500}
{"wood":25500,"stone":19586,"iron":25500}
Traceback (most recent call last):
  File "C:\Python\eclipse-SDK-4.2-win32\eclipse\plugins\org.python.pydev_2.6.0.2012062818\pysrc\pydevd.py", line 1392, in <module>
    debugger.run(setup['file'], None, None)
  File "C:\Python\eclipse-SDK-4.2-win32\eclipse\plugins\org.python.pydev_2.6.0.2012062818\pysrc\pydevd.py", line 1085, in run
    pydev_imports.execfile(file, globals, locals) #execute the script
  File "C:\Users\Noutbook\workspace\proba\Seganapa3RU8.py", line 106, in <module>
    resource = g.rex_text('resources".*),"storage')
  File "C:\Python27\Lib\site-packages\grab-0.4.5-py2.7.egg\grab\ext\rex.py", line 28, in rex_text
    raise DataNotFound('Regexp not found')
grab.error.DataNotFound: Regexp not found

Один раз даже полностью отработало…
Но в основном на каком то этапе цикла он не находит регулярку… Что может быть?



—————————————————————–
Изучаю и параллельно использую Python 2.7

Отредактировано Seganapa (Авг. 23, 2012 13:15:28)

Офлайн

#6 Авг. 23, 2012 13:55:13

Seganapa
От: Новороссийск
Зарегистрирован: 2012-07-31
Сообщения: 139
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсинг Json при помощи Grab

При помощи log_dir выяснил, что при отправке подряд нескольких запросов, в один прекрасный момент возвращается пустая страница… Что это может быть?



—————————————————————–
Изучаю и параллельно использую Python 2.7

Отредактировано Seganapa (Авг. 23, 2012 14:06:08)

Офлайн

#7 Авг. 23, 2012 14:29:10

slav0nic
Команда
От: dp.ua
Зарегистрирован: 2006-05-07
Сообщения: 2267
Репутация: +  41  -
Профиль   Отправить e-mail  

Парсинг Json при помощи Grab

Seganapa
задайте этот вопрос админу сайта, который парсите …

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version