2014-09-24 2 views
0

У меня есть несколько вопросов, которые были бы мне признательны, если бы они были отвечены, но сначала немного фона, чтобы вы знали, что я здесь ищу. Я написал код на python, который разбирает некоторую информацию с веб-сайта и сохраняет содержимое в списке. Чтобы упростить вещи, я покажу вам код, который у меня есть прямо сейчас.Отправка JSON с python

import lxml.html 
from lxml.etree import XPath 


url = "http://gbgfotboll.se/information/?scr=table&ftid=51168" 
date = '2014-09-27' 
# use this in real mode: currentDate = (time.strftime("%Y-%m-%d")) 
list = [] 
rows_xpath = XPath("//*[@id='content-primary']/table[3]/tbody/tr[td[1]/span/span//text()='%s']" % (date)) 
time_xpath = XPath("td[1]/span/span//text()[2]") 
team_xpath = XPath("td[2]/a/text()") 

html = lxml.html.parse(url) 

for row in rows_xpath(html): 
    time = time_xpath(row)[0].strip() 
    team = team_xpath(row)[0] 
    list.append(time + " " + team) 

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

Вопросы

1) Список я есть я должен преобразовать его в словарь, прежде чем я отправить его или же я просто использовать обычный json.dump()?

2) После внесения содержимого в формат JSON, как получить этот контент в веб-службе, чтобы я мог получать запросы от приложения iphone для извлечения информации? Возможно ли это в python?

Если я говорю что-то неправильно здесь, мне очень жаль, что я новичок в этом, но теперь я устал от поиска в Интернете через 3 дня, мне нужны прямые ответы. Если я скажу что-то неправильно, просто исправьте меня и скажите мне, как правильно делать то, что я хочу делать.

Большое спасибо!

+1

«У меня есть несколько вопросов», как правило, означает, что вы должны опубликовать несколько вопросов, а не только один. – abarnert

+0

Кроме того, «Список, который я должен преобразовать в словарь, прежде чем отправить его»: Ну, это зависит от информации, которую вы нам не дали. В каком формате вы хотите, чтобы приложение iPhone увидело его? Если вы хотите объект JSON (dict), преобразуйте его в словарь.Если вам нужен массив JSON (список), не делайте этого. Кроме того, когда вы «конвертируете его в словарь», какими будут ключи и значения? Если у вас нет ответа на этот вопрос, вам, вероятно, не нужен словарь; если есть очевидный ответ на этот вопрос, вы часто это делаете. – abarnert

+0

Вы можете ясно видеть, что у меня есть 2 вопроса, а во втором у меня есть 2 вопроса, поэтому всего 3. – 2014-09-24 18:56:03

ответ

0

Вместо «отправки» вывода на ваш iPhone, как насчет его получения из вашего приложения? Если вы запускаете свой код в качестве приложения Flask на общедоступном веб-сервере, это должно быть легко. Я предполагаю, что у iOS SDK есть библиотека, которая обрабатывает HTTP-запросы. Упрощенный пример:

from flask import Flask 
import lxml.html 
import json 
from lxml.etree import XPath 

app = Flask(__name__) 

@app.route("/") 
def hello(): 
    url = "http://gbgfotboll.se/information/?scr=table&ftid=51168" 
    date = '2014-09-27' 
    # use this in real mode: currentDate = (time.strftime("%Y-%m-%d")) 
    list = [] 
    rows_xpath = XPath("//*[@id='content-primary']/table[3]/tbody/tr[td[1]/span/span//text()='%s']" % (date)) 
    time_xpath = XPath("td[1]/span/span//text()[2]") 
    team_xpath = XPath("td[2]/a/text()") 

    html = lxml.html.parse(url) 

    for row in rows_xpath(html): 
     time = time_xpath(row)[0].strip() 
     team = team_xpath(row)[0] 
     list.append(time + " " + team) 

    return json.dump(list) 

if __name__ == "__main__": 
    app.run() 

О вашем вопросе, если вы должны преобразовать свой список в dict: это не обязательно.

Кстати, вместо использования lxml/xpath вы также можете использовать BeautifulSoup для просмотра DOM. По-моему, это немного легче читать.

+0

Да, это то, о чем я думал. Мое приложение iphone сделает запрос GET, и когда он это сделает, он получит данные, которые хранятся в списке. Как получить информацию с python на доступный веб-сервер? Нужно ли мне это делать вручную? Потому что я хочу, чтобы это было что-то автоматическое? Хорошо так регулярно json.dumps() достаточно ?. Нужно ли мне сбрасывать содержимое JSON в файл? @Bjorn – 2014-09-24 18:38:33

+0

Я читал, что lxml/xpath намного быстрее, чем beautifulSoup, но спасибо в любом случае @Bjorn – 2014-09-24 18:40:39

+0

Я обновил свой код простым (непроверенным) примером. Но я думаю, это должно заставить вас начать. Вы можете запустить это приложение в сервисе Heroku (например). У Heroku есть учебник, который поможет вам развернуть свое первое приложение: https://devcenter.heroku.com/articles/getting-started-with-python-o – Bjorn

0

Чтобы добавить к @Bjorn ответ, что-то, что может быть неясно: код Python, который вы пишете, не должен выставлять JSON-выход в другое место для приложения, а затем извлекать; скорее, код Python - это веб-сервис, и каждый раз, когда ваше приложение делает HTTP-запрос, код запускается снова, генерирует новый список JSON и возвращает это в ответе HTTP.

Для того, чтобы это сработало, вам нужно иметь веб-сервер, который работает где-то, например, Героку, как предложил Бьорн (в учебнике, который он связал, вы заменили бы содержимое своей функции hello кодом). После того, как он будет запущен, будет указан URL-адрес, к которому вы можете обратиться. Для вашего iPhone-приложения для получения данных он может отправить запрос на этот URL-адрес, а веб-сервер будет запускать ваш код Python и возвращать список JSON в приложение.

Кроме того, он должен быть json.dumps, а не json.dump (для последнего требуется файл для записи, тогда как первый просто возвращает строку, закодированную в JSON).

+0

Вот что я хотел услышать: D Теперь я могу начать делать что-то! Мне нужно будет написать код для его обработки запросов GET/POST? @Avril – 2014-09-24 19:43:40

+0

Метод 'hello' в примере @ Bjorn - это то, что произойдет с запросом GET. Декоратор '@ app.route' - это то, что говорит фляге, что«/»означает, что путь, который вы должны сделать GET-запрос, является корневым путем для приложения (например, если ваш веб-сервер« http: // myserver.example.com/', тогда запрос на этот URL-адрес вернет ваш список JSON), и предполагается, что метод GET, если вы не укажете. Чтобы создать функцию, которая обрабатывает запросы POST, вы можете украсить ее с помощью '@ app.route ("/", methods = [" POST "]). – Avril

+0

Я запустил его и запустил, и я могу увидеть список строк в симуляторе, спасибо вам большое: D. @Avril – 2014-09-25 14:48:10

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