查找并复制字符串

时间:2016-09-19 00:11:46

标签: python-3.x

以下代码是我迄今为止的完整程序:

from datetime import timedelta
from datetime import datetime
import urllib.request
import urllib.parse
import re
import pprint

#Falchion Knife Stained (Minimum Wear)
falchion_stained_MW = 'http://steamcommunity.com/market/listings/730/%E2%98%85%20Falchion%20Knife%20%7C%20Stained%20%28Minimal%20Wear%29'

values = {'s':'basics',
          'submit':'search'}

data = urllib.parse.urlencode(values)
data = data.encode('utf-8')
req = urllib.request.Request(falchion_stained_MW, data)
resp = urllib.request.urlopen(req)
falchion_stained_MW_respdata = resp.read()
#pprint.pprint(falchion_stained_MW_respdata)


Unfiltered_Item_Trade_History = re.findall(r"\[\"\w{3}\s\d{2}\s\d{4}\s\d{2}:\s\+\d\"\,\d{1,3}\.\d{1,4}\,\"\d\"\]",str(falchion_stained_MW_respdata))
Unfiltered_Item_Trade_History_String = str(Unfiltered_Item_Trade_History)
Item_Trade_History1 = Unfiltered_Item_Trade_History_String.replace('["', "")
Item_Trade_History2 = re.sub(r'\s\d{2}\:\s\+\d\"\,', ": $", Item_Trade_History1)
Item_Trade_History3 = re.sub(r'\,\"\d\"\]', "", Item_Trade_History2)
Item_Trade_History4 = Item_Trade_History3.replace(r"[", "")
Item_Trade_History = Item_Trade_History4.replace(r"]", "")
#print(Item_Trade_History)


Current_Date = datetime.now()
Date_10_Days_Ago = datetime.now() - timedelta(days=10)

item_sales = [sale.split(': +0",') for sale in Item_Trade_History]
sales_10_days = [float(sale[1]) for sale in item_sales if datetime.strptime(sale[0], '%b %d %Y') - Date_10_Days_Ago > timedelta(days=0)]
print(sales_10_days)

代码行“Unfiltered_Item_Trade_History”打印以下内容。这些数据是原始形式,正是网站在抓取时提供的内容:

['[“2016年9月15日16:+ 0”,40.434,“2”]','[“2016年9月15日18:+ 0”,42.556,“1”]','[“2016年9月16日05:+ 0“,43.482,”1“]','[”2016年9月16日12:+ 0“,43.129,”1“]','[”2016年9月16日14:+ 0“,41.289,”1 “]','[”2016年9月16日18:+ 0“,40.67,”1“]','[”2016年9月16日19:+ 0“,41.902,”2“]','[”2016年9月16日23:+ 0“,41.4,”1“]','[”2016年9月17日02:+ 0“,43.495,”1“]','[”2016年9月17日04:+ 0“,43.562,”1 “]','[”2016年9月17日07:+ 0“,44.009,”1“]','[”2016年9月17日13:+ 0“,44.674,”2“]','[”2016年9月17日17:+ 0“,42.222,”1“]','[”2016年9月18日00:+ 0“,40.882,”1“]','[”2016年9月18日08:+ 0“,39.094,”1 “]','[”2016年9月18日11:+ 0“,40.211,”1“]','[”2016年9月18日12:+ 0“,41.088,”1“]','[”2016年9月18日14:+ 0“,44.571,”2“]','[”2016年9月18日17:+ 0“,36.23,”1“]','[”2016年9月18日20:+ 0“,41.34,”1 “]','[”2016年9月18日23:+ 0“,36.6,”1“]','[”2016年9月19日00:+ 0“,39.999,”1“]','[”2016年9月19日14:+ 0“,40.636,”1“]','[”2016年9月19日15:+ 0“,40.009,”1“]','[”2016年9月19日16:+ 0“,38.625,”1 “]','[”2016年9月19日17:+ 0“,39.101,”1“]','[”2016年9月19日18:+ 0“,39.361,”2“]']

下一行代码“Unfilitered_Item_Trade_History_String”返回与上面相同的列表,但是以字符串形式。

为了使它达到你在下面编写的格式,我必须使用上面的所有行+ Item_Trade_History1到4.此代码删除所有额外的字符,并在需要的地方添加$ dollar符号。一旦我到达最后一行代码“Item_Trade_History”,它将返回以下列表:

'2016年9月15日:40.434美元','2016年9月15日:42.556美元',2016年9月16日:43.482美元',2016年9月16日:43.129美元',2016年9月16日:41.289美元',2016年9月16日:40.67美元,'2016年9月16日:$ 41.902','2016年9月16日:41.4美元','2016年9月17日:43.495美元','2016年9月17日:43.562美元','2016年9月17日:44.009美元','2016年9月17日:44.674美元',' 2016年9月17日:$ 42.222','2016年9月18日:$ 40.882','2016年9月18日:$ 39.094','2016年9月18日:$ 40.211','2016年9月18日:$ 41.088','2016年9月18日:$ 44.571','Sep 18 2016年:$ 36.23','2016年9月18日:41.34美元','2016年9月18日:36.6美元','2016年9月19日:39.999美元','2016年9月19日:40.636美元','2016年9月19日:40.009美元',2016年9月19日: $ 38.625','2016年9月19日:$ 39.101','2016年9月19日:$ 39.361'

此返回的列表与您在下面添加的列表相同,是吗?

现在我添加了你给我的修改代码。

“item_sales = [sale.split(”:$“)在Item_Trade_History中出售[1:len(Item_Trade_History) - 1] .split(”','“)]”

并打印“item_sales”,返回此内容:

[['2016年9月15日“,”42。27“,2016年9月15日,”43.337“,2016年9月15日,”40.434“,”2016年9月15日“,”42.556“,”2016年9月16日“ ,“43.482','2016年9月16日”,“43.129”,“2016年9月16日”,“41。289”,“2016年9月16日”,“40。67”,“2016年9月16日”,“41。902”,“2016年9月16日” ,“41.4','2016年9月17日”,“43.495”,“2016年9月17日”,“43。5662”,“2016年9月17日”,“44。009”,“2016年9月17日”,“44。6474”,“2016年9月17日” ,“42.222”,“2016年9月18日”,“40.882”,“2016年9月18日”,“39。0994”,“2016年9月18日”,“40。2011”,“2016年9月18日”,“41。0888”,“2016年9月18日” ,“44.571”,“2016年9月18日”,“36.23”,“2016年9月18日”,“41。34”,“2016年9月18日”,“36。6”,“2016年9月19日”,“39。999”,“2016年9月19日” ,“40.636”,“2016年9月19日”,“40。009”,“2016年9月19日”,“38.625”,“2016年9月19日”,“39.101”,“2016年9月19日”,“39 .361”]

现在我们把它分开了,这看起来是否正确?我们越来越亲密!!!!

好的,现在当我使用最后一行代码时:

如果datetime.strptime(sale [0],'%b%d%Y'),则在item_sales中出售

sales_10_days = [float(sale [1]) - Date_10_Days_Ago> timedelta(天= 0)]

并打印“sales_10_days”,它返回:

[]

至少没有错误!!!但为什么最后一点代码不起作用?我们非常接近,我可以品尝它。你不知道我多么欣赏你的男人。非常感谢你们所有这一切。

2 个答案:

答案 0 :(得分:0)

循环有什么问题?或者,为了更加pythonic,你可以使用列表理解。

示例:

item_sales = [sale.split(": $") for sale in item_sales_data[1:len(item_sales_data) - 1].split("','")]
sales_10_days = [float(sale[1]) for sale in item_sales if datetime.strptime(sale[0], "%b %d %Y") - Date_10_Days_ago > timedelta(days=0)]

注意:要使用datetime.strptime,您可以使用datetime import datetime或使用datetime.datetime.strptime。

编辑:要以原始格式应用数据,您可以执行以下操作:

import json
#Parse each sub array that is in JSON format
item_sales_data = [json.loads(sale) for sale in Unfiltered_Item_Trade_History]
#Trim the timezone information out of dates since it is not in a strptime friendly format
item_sales = [[sale[0][:len(sale[0]) - 4], sale[1]] for sale in item_sales_data]
#Filter the list and return only the prices from the last 10 days
sales_10_days = [sale[1] for sale in item_sales if datetime.strptime(sale[0], "%b %d %Y %H") - Date_10_Days_ago > timedelta(days=0)]

答案 1 :(得分:0)

'date: price'拆分为[date, price],然后比较日期和Date_10_Days_Ago,获取过去10天的列表并按日期排序。

from datetime import datetime
from datetime import timedelta

item_sales_data = 'Sep 15 2016: $42.27','Sep 15 2016: $43.337', 'Sep 15 2016: $40.434','Sep 15 2016: $42.556', 'Sep 16 2016: $43.482','Sep 16 2016: $43.129', 'Sep 16 2016: $41.289','Sep 16 2016: $40.67', 'Sep 16 2016: $41.902','Sep 16 2016: $41.4', 'Sep 17 2016: $43.495', 'Sep 17 2016: $43.562', 'Sep 17 2016: $44.009', 'Sep 17 2016: $44.674', 'Sep 17 2016: $42.222', 'Sep 18 2016: $40.882', 'Sep 18 2016: $39.094', 'Sep 18 2016: $40.211','Sep 18 2016: $41.088', 'Sep 18 2016: $44.571', 'Sep 18 2016: $36.23'

Date_10_Days_Ago = datetime.now() - timedelta(days=10)

# split 'Sep 15 2016: $42.27' to (date('Sep 15 2016'), '$42.27')
date_prices = [data.split(": ") for data in item_sales_data if datetime.strptime(data.split(": ")[0], "%b %d %Y") > Date_10_Days_Ago]



# sort date_prices by date
def dateKey(data):
    return datetime.strptime(data[0], "%b %d %Y")

date_prices.sort(key=dateKey, reverse=True)

# only need prices
prices = [p[1] for p in date_prices]
print(prices)