2015-05-06 6 views
2

Примечание: Я новичок в python, javascript и соскабливании.Как разобрать этот тип текста?

Я соскабливаю веб-сайт на питоне, используя красивый суп и механизирую. Некоторые данные загружаются через запросы ajax. У меня возникли проблемы со сбоем ответа.

Пример запроса Ajax URL: http://example.com/getJSData/?file=/data/js/GetData.js&cmd=GETDATA&rc=BGAN

Образец ответа: d1 = [[ "m11", "m12", "m13"], [ "m21", "m22", "m23" ]]; d2 = [["x11", "x12"], ["x21", "x22"], ["x31", "x32"]]

Хотя весь ответ не является надлежащим json-объектом , значения каждого из d1 и d2 являются допустимым объектом JSON, что я могу анализировать с использованием некоторого json-парсера в python. Но как разобрать весь ответ?

Очевидным способом является поиск всего «=» в ответе и извлечение объекта json, а затем его анализ с помощью json parser.

Но я считаю, что должен быть более элегантный способ сделать это (анализ всего ответа). Не могли бы вы посоветовать?

Заранее благодарен!

+0

Один быстрого примечания, я считаю, вы имеете в виду 'scraping', не' scrapping' – Dendromaniac

+0

Как ответ возвращаемый? Какой тип объекта? Строка? –

+0

Ответ в действительном синтаксисе Python ... Интересно, будет ли вообще полезно использовать ast.parse. – Kevin

ответ

3

Как отмечает Кевин, это достаточно близко к Python, которые мы можем использовать в ast модуль (в частности, ast.parse и ast.literal_eval). Например:

>>> import ast 
>>> s = '''d1=[["m11","m12","m13"],["m21","m22","m23"]];d2=[["x11", "x12"],["x21", "x22"],["x31", "x32"]]''' 
>>> {b.targets[0].id: ast.literal_eval(b.value) for b in ast.parse(s).body} 
{'d2': [['x11', 'x12'], ['x21', 'x22'], ['x31', 'x32']], 
'd1': [['m11', 'm12', 'm13'], ['m21', 'm22', 'm23']]} 
+0

Один вопрос. Является ли вывод, что вы показали правильный json-объект? Попробовать его на jsonlint.com, чтобы увидеть правильность, предполагает иное. – user1599964

+1

@ user1599964: no, вывод, который я показал, является словарем Python. Если вы хотите кодировать это как json, просто привяжите его к чему-то (например, 'd'), а затем выполните' json.dumps (d) '. – DSM

0

Просто оберните ваш ответ в объект JSON следующим образом:

JSON Ответ:

{ 
    d1:[["m11","m12","m13"],["m21","m22","m23"]], 
    d2:[["x11", "x12"],["x21", "x22"],["x31", "x32"]] 
}; 
+2

Я думаю, что он получает ответ, а не генерирует его. Поэтому он не может легко изменить «=» на «:» без серьезного разбора. – Kevin

+0

@ Кевин: Да, правильно. Получение ответа. В ответе мне нужно было бы изменить '=' -> ':', а также ';' -> ','. Однако прямая замена может сломать ответ. – user1599964

Смежные вопросы