Как сделать rp и xrange динамическими?
Эй, ребята, большое спасибо, что нашли время взглянуть на мою проблему, я работаю над этим кодом около 1 недели (я новичок в кодировании и в Python также 1 неделю). В настоящее время цикл работает только если x в xrange(x) и 'rp': 'x' - правильное количество строк, доступных в этом xml. XML-обновления в течение дня, мне было интересно, кто-нибудь может предложить решение, чтобы сделать X динамическим?
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('> (.*)<')
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
2 ответа
Сначала я расскажу о том, как вы просматриваете свои результаты. Основываясь на вашем коде, xmlload1['rows']
это массив dicts, поэтому вместо выбора произвольного числа вы можете вместо этого перебирать его напрямую. Чтобы сделать это лучшим примером, я собираюсь установить некоторые произвольные данные, чтобы прояснить это:
xmlload1 = {
"rows": [{"cell": {"username": "one", "race_horse":"b"}}, {"cell": {"username": "two", "race_horse": "c"}}]
}
Итак, учитывая данные выше, вы можете просто перебирать строки в цикле for, например так:
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
диктовать функции напрямую.
Я не уверен, что понимаю ваш вопрос, но я думаю, что вы хотите это:
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(…)
для любой цели, кроме фиксированного количества итераций, вы делаете это неправильно. Обычно есть коллекция, которую вы хотите перебрать; просто найдите его и переберите.