2013-06-02 2 views
1

Привет, ребята, большое спасибо за то, что нашли время, чтобы посмотреть на мою проблему, я работаю над этим кодом около 1 недели (я новичок в кодировании и на python 1 неделю). В настоящее время цикл работает только в том случае, если x в xrange (x) и 'rp': 'x' - правильное количество строк, доступных из этого xml. Xml обновляется в течение дня, мне было интересно, может ли кто-нибудь предложить решение для x-динамического?Как сделать динамику rp и xrange?

import mechanize 
import urllib 
import json 
import re 
from sched import scheduler 
from time import time, sleep 

from sched import scheduler 
from time import time, sleep 

s = scheduler(time, sleep) 

def run_periodically(start, end, interval, func): 
event_time = start 
while event_time < end: 
    s.enterabs(event_time, 0, func,()) 
    event_time += interval 
s.run() 

def getData(): 
post_url = "urlofinterest_xml" 
browser = mechanize.Browser() 
browser.set_handle_robots(False) 
browser.addheaders = [('User-agent', 'Firefox')] 

######These are the parameters you've got from checking with the aforementioned tools 
parameters = {'page' : '1', 
       'rp' : '8', 
       'sortname' : 'roi', 
       'sortorder' : 'desc' 
      } 
#####Encode the parameters 
data = urllib.urlencode(parameters) 
trans_array = browser.open(post_url,data).read().decode('UTF-8') 

xmlload1 = json.loads(trans_array) 
pattern1 = re.compile('>&nbsp;&nbsp;(.*)<') 
pattern2 = re.compile('/control/profile/view/(.*)\' title=') 
pattern3 = re.compile('<span style=\'font-size:12px;\'>(.*)<\/span>') 
pattern4 = re.compile('title=\'Naps posted: (.*) Winners:') 
pattern5 = re.compile('Winners: (.*)\'><img src=') 


for i in xrange(8): 
    user_delimiter = xmlload1['rows'][i]['cell']['username'] 
    selection_delimiter = xmlload1['rows'][i]['cell']['race_horse'] 

    username_delimiter_results = re.findall(pattern1, user_delimiter)[0] 
    userid_delimiter_results = int(re.findall(pattern2, user_delimiter)[0]) 
    user_selection = re.findall(pattern3, selection_delimiter)[0] 
    user_numberofselections = float(re.findall(pattern4, user_delimiter)[0]) 
    user_numberofwinners = float(re.findall(pattern5, user_delimiter)[0]) 

    strikeratecalc1 = user_numberofwinners/user_numberofselections 
    strikeratecalc2 = strikeratecalc1*100 

    print "user id = ",userid_delimiter_results 
    print "username = ",username_delimiter_results 
    print "user selection = ",user_selection 
    print "best price available as decimal = ",xmlload1['rows'][i]['cell']  ['tws.best_price'] 
    print "race time = ",xmlload1['rows'][i]['cell']['race_time'] 
    print "race meeting = ",xmlload1['rows'][i]['cell']['race_meeting'] 
    print "ROI = ",xmlload1['rows'][i]['cell']['roi'] 
    print "number of selections = ",user_numberofselections 
    print "number of winners = ",user_numberofwinners 
    print "Strike rate = ",strikeratecalc2,"%" 
    print "" 


getData() 


run_periodically(time()+5, time()+1000000, 15, getData) 

Сердечные приветы AEA

ответ

4

Во-первых, я собираюсь рассказать о том, как вы перебираете свои результаты. На основе вашего кода xmlload1['rows'] представляет собой массив dicts, поэтому вместо того, чтобы выбирать произвольное число, вы можете перебирать его напрямую. Для того, чтобы сделать это лучший пример, я собираюсь установить некоторые произвольные данные, чтобы сделать это ясно:

xmlload1 = { 
    "rows": [{"cell": {"username": "one", "race_horse":"b"}}, {"cell": {"username": "two", "race_horse": "c"}}] 
} 

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

for row in xmlload1['rows']: 
    cell = row["cell"] 
    print cell["username"] 
    print cell["race_horse"] 

Каждая итерация, ячейки принимает значение другого элемента в итерацию (список в xmlload1['rows']). Это работает с любым контейнером или последовательности, которая поддерживает итерации (как lists, tuples, dicts, generators и т.д.)

Обратите внимание, как я не использовал никаких магических чисел в любом месте, так xmlload1['rows'] может быть сколь угодно долго, и она будет по-прежнему работать ,

Вы можете задать запросы должны быть динамичными, используя функцию, например:

def get_data(rp=8, page=1): 
    parameters = {'page' : str(page), 
       'rp' : str(rp), 
       'sortname' : 'roi', 
       'sortorder' : 'desc' 
      } 
    data = urllib.urlencode(parameters) 
    trans_array = browser.open(post_url,data).read().decode('UTF-8') 
    return json.loads(trans_array) 

Теперь вы можете вызвать get_data(rp=5), чтобы получить 5 строк или get_data(rp=8), чтобы получить 8 строк [и get_data(rp=8, page=3), чтобы получить третья страница] и т. д. И вы можете явно добавить дополнительные переменные или даже передать в функцию parameters dict функции.

+0

Привет, Джефф, прежде всего большое спасибо за ответ на вопрос и еще больше очков за то, что он сделал это как урок, полностью объяснив ваш ответ. Если моя интерпретация правильная, мне нужно определить, что строка (разъяснение?), Как у вас есть: 'xmlload1 = { " rows ": [{" cell ": {" username ":" one "," race_horse ": "b"}}, {"cell": {"username": "two", "race_horse": "c"}}]} ' – AEA

+0

@AEA вам не нужно определять, что такое строка, на основе вашего код, это структура данных, которые генерирует ваш запрос. Добавьте 'print xmlload1' в свой код после строки с' json.loads', и вы поймете, что я имею в виду. –

+0

Пример xml, который я читаю: '' {u'cell ': {u'username': u '  RobLloyd91', u'roi ': u'18 to go', u'race_time ': u'16: 15 ', 'Как бы это определить (обратите внимание, что я могу регулярно использовать неправильный жаргон.Еще обучение) – AEA

2

Я не уверен, я понимаю ваш вопрос, но я думаю, что вы хотите это:

rows = xmlload1['rows'] 
for row in rows: 
    user_delimiter = row['cell']['username'] 
    selection_delimiter = row['cell']['race_horse'] 
    # ... 

Если вам нужен индекс строки, а также грести себя, использовать enumerate:

rows = xmlload1['rows'] 
for i, row in enumerate(rows): 
    user_delimiter = row['cell']['username'] 
    selection_delimiter = row['cell']['race_horse'] 
    # ... 

В общем, если вы делаете for i in range(…) для любых целей, кроме фиксированного количества итераций, вы делаете это неправильно. Обычно есть коллекция, которую вы хотите перебрать; просто найдите его и повторите по нему.

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