提问人:K D 提问时间:10/16/2023 最后编辑:K D 更新时间:10/16/2023 访问量:69
写入每个循环周期的特定字典列表
Write to specific dictionary list for each cycle of loop
问:
第一,我对 Python 非常陌生,所以请不要把我的头从:)上移开我一整天都在阅读并尝试让它发挥作用,但我就是想不通。
我有一个列表:它是通过体育网站上网页的抓取选项卡创建的(列表全天变化),其中包含 ex。allLeagues = []
['NFL', 'NFL1Q', 'MLB', 'SOCCER', 'MLBLIVE', 'NFL1H', 'LoL', 'NBASZN', 'CSGO', 'KBO', 'CS2', 'TENNIS', 'MMA', 'CRICKET']
然后,我循环浏览每个联赛/标签并获取我需要的一切:
AllPlayers = []
for league in leagues:
driver.find_element(By.XPATH, f"//div[@class='name'][normalize-space()='{league}']").click()
time.sleep(2)
# Wait for the stat-container element to be present and visible
stat_container = WebDriverWait(driver, 10.until(EC.visibility_of_element_located((By.CLASS_NAME, "stat-container")))
# Find all stat elements within the stat-container
# i.e. categories is the list ['Points','Rebounds',...,'Turnovers']
categories = driver.find_element(By.CSS_SELECTOR, ".stat-container").text.split('\n')
# Iterate over each stat element
for category in categories:
# Click the stat element
line = '-'*len(category)
print(line + '\n' + category + '\n' + line)
driver.find_element(By.XPATH, f"//div[text()='{category}']").click()
projections = WebDriverWait(driver, .until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, ".projection")))
for projection in projections:
names = projection.find_element(By.XPATH, './/div[@class="name"]').text
points= projection.find_element(By.XPATH, './/div[@class="presale-score"]').get_attribute('innerHTML')
text = projection.find_element(By.XPATH, './/div[@class="text"]').text.replace('\n','')
print(names, points, text)
players = {'Name': names, 'Prop':points, 'Line':text}
AllPlayers.append(players)
它循环浏览每个联赛/标签并抓住我需要的一切。
我现在感到困惑的地方是,我想将循环的每个周期附加到单独的列表中。我可以把它们都放到一个列表中,但我希望每个不同联赛的数据都在它自己的列表中。例如,从 NFL 选项卡抓取数据时,在字典中追加到 NFL[]。
我一直在阅读的所有内容都说要创建一本词典,所以我尝试:
list_dict = {}
for league in allLeagues:
list_dict[league] = []
print(list_dict)
返回以下内容: 字典打印(尝试发布代码,但 SO 说我的帖子看起来像垃圾邮件,而且由于我是新手,所以还不能在这里上传图片) 不太确定我在那里做错了什么,但我假设我所需要的只是该字典的最后一行:
{'NFL': [], 'NFL1Q': [], 'MLB': [], 'SOCCER': [], 'MLBLIVE': [], 'NFL1H': [], 'LoL': [], 'NBASZN': [], 'CSGO': [], 'KBO': [], 'CS2': [], 'TENNIS': [], 'MMA': [], 'CRICKET': []}
所以这就是我所处的位置。试图理解我从列表中创建字典的错误。并将循环中抓取的数据附加到每个单独的字典条目/列表中。
任何帮助都非常感谢!谢谢!
答:
你可以这样做:
leagues = { league: [] for league in allLeagues}
for league, players in leagues.items():
...
for category in categories:
....
players = {'Name': names, 'Prop':points, 'Line':text}
players.append(players)
leagues.items()
将取出字典的键和值。因此,它将返回联赛的名称和属于该联赛的(在开始时)空列表,我们在 for 循环中将其称为球员。
最后,你只需将你抓取的球员附加到该列表中即可。
这里需要注意的一个概念是不变性与可变性。基本上 python 列表是可变的,所以你可以在 for 循环中取出对列表的引用,用 append 向它添加元素,即使你没有将完整的列表写回字典,这些更改也会反映在字典中。
例如,有关该概念的更多详细信息,请参阅此处,它在 Python 中非常重要,并且通常会导致问题/误解。
评论
AllPlayers = { league:[] for league in allLeagues}
AllPlayers[league].append(players)
for