嘿,伙计们,非常感谢你们花时间来研究我的问题,我已经花了大约一个星期的时间来研究这段代码(我对编码和python也是一个新手)目前只有在x范围(x)和'rp'中的x才有效:'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)
谨致问候
首先,我将讨论如何对结果进行迭代。根据您的代码,
xmlload1['rows']
是一个dict数组,因此您可以直接迭代它,而不是选择任意数字。为了更好地说明这个问题,我将设置一些任意的数据来说明这一点:因此,对于上面的数据,您可以在for循环中迭代行,如下所示:
^{pr2}$每次迭代,cell接受iterable中另一个元素的值(
xmlload1['rows']
中的列表)。这适用于任何支持迭代的容器或序列(如lists
、tuples
、dicts
、generators
等)请注意,我在任何地方都没有使用任何幻数,因此
xmlload1['rows']
可以任意长,并且仍然可以工作。在您可以使用以下函数将请求设置为动态的:
现在,您可以调用
get_data(rp=5)
获取5行,或调用get_data(rp=8)
获取8行[和get_data(rp=8, page=3)
获取第三页],等等,您可以清楚地添加其他变量,甚至可以直接将parameters
dict传递给函数。在我不太明白你的问题,但我想你想要的是:
如果需要行索引和行本身,请使用
^{pr2}$enumerate
:一般来说,如果你做
for i in range(…)
不是为了固定数量的迭代,那么你做得不对。通常有一个集合需要迭代;只需找到它并对其进行迭代。在相关问题 更多 >
编程相关推荐