【问题标题】:'str' object does not support item assignment in Python, Web-scraping'str' 对象不支持 Python 中的项目分配,Web 抓取
【发布时间】:2019-01-10 11:52:23
【问题描述】:

我正在尝试重组我已经存在/工作的代码。 在第二个 for 循环内进行更改。 为什么在更改我的代码时会出现错误:

import numpy as np
import pandas as pd
import requests
import json
from sklearn import preprocessing
from sklearn.preprocessing import OneHotEncoder

games_played = []
stats_for_games = []
for game_id in range(2017020001, 2017020010, 1):
    url = 'https://statsapi.web.nhl.com/api/v1/game/{}/boxscore'.format(game_id)
    r_2017 = requests.get(url)
    game_data_2017 = r_2017.json()

    for homeaway in ['home','away']:

        game_dict_2017 = game_data_2017.get('teams').get(homeaway).get('teamStats').get('teamSkaterStats')
        game_dict_2017['team'] = game_data_2017.get('teams').get(homeaway).get('team').get('name')
        game_dict_2017['homeaway'] = homeaway
        game_dict_2017['game_id'] = game_id
        games_played.append(game_dict_2017)

print(games_played)

到这里:

import numpy as np
import pandas as pd 
import requests
import json
from sklearn import preprocessing
from sklearn.preprocessing import OneHotEncoder

games_played = []
stats_for_games = []
    for game_id in range(2017020001, 2017020010, 1):
    url = 'https://statsapi.web.nhl.com/api/v1/game/{}/boxscore'.format(game_id)
    r_2017 = requests.get(url)
    game_data_2017 = r_2017.json()

    for homeaway in ['home','away']:

        game_dict_2017 = game_data_2017.get('teams').get(homeaway).get('team').get('name')
        game_dict_2017['homeaway'] = homeaway
        game_dict_2017['game_id'] = game_id
        games_played.append(game_dict_2017)

print(games_played)

运行时报错TypeError: 'str' object does not support item assignment

出现在

 game_dict_2017['homeaway'] = homeaway

JSON 数据示例

{
copyright: "NHL and the NHL Shield are registered trademarks of the 
National Hockey League. NHL and NHL team marks are the property of the 
NHL and its teams. © NHL 2019. All Rights Reserved.",
teams: {
     away: {
         team: { 
                id: 9,
                name: "Ottawa Senators",
                link: "/api/v1/teams/9"
 },
teamStats: {
    teamSkaterStats: {
                   goals: 0,
                   pim: 0,
                   shots: 0,

 }
 }

【问题讨论】:

  • JSON 数据是嵌套字典,这就是我使用该方法的原因。以前工作过
  • 您能否添加您尝试使用的数据样本?我认为您只是错误地将game_dict_2017 覆盖为game_dict_2017 = game_data_2017.get('teams').get(homeaway).get('team').get('name') 中的字符串,然后尝试像分配之前一样使用game_data_2017
  • 你能解释一下你到底想重组什么吗?

标签: python loops web-scraping


【解决方案1】:

好吧,我终于明白是什么问题了。

之前的代码是:

# In this line you created a dictionary
game_dict_2017 = game_data_2017.get('teams').get(homeaway).get('teamStats').get('teamSkaterStats')

# Here, since you have dictionary you rewrote values or created new one
game_dict_2017['team'] = game_data_2017.get('teams').get(homeaway).get('team').get('name')
game_dict_2017['homeaway'] = homeaway
game_dict_2017['game_id'] = game_id
games_played.append(game_dict_2017)

当前代码是:

# Here you are getting a string
# You previous code was 
# game_dict_2017['team'] = game_data_2017.get('teams').get(homeaway).get('team').get('name')
game_dict_2017 = game_data_2017.get('teams').get(homeaway).get('team').get('name')

# Here you are trying to work with a string as with dictionary
game_dict_2017['homeaway'] = homeaway
game_dict_2017['game_id'] = game_id
games_played.append(game_dict_2017)

为了解决此问题并假设您不再需要 game_dict_2017 = game_data_2017.get('teams').get(homeaway).get('teamStats').get('teamSkaterStats') 行,代码将如下所示:

game_dict_2017 = dict()
game_dict_2017['team'] = game_data_2017.get('teams').get(homeaway).get('team').get('name')
game_dict_2017['homeaway'] = homeaway
game_dict_2017['game_id'] = game_id

你也可以这样做:

game_dict_2017 = {
    'team': game_data_2017.get('teams').get(homeaway).get('team').get('name'),
    'homeaway': homeaway,
    'game_id': game_id
}

【讨论】:

    【解决方案2】:
        game_dict_2017 = game_data_2017.get('teams').get(homeaway).get('team').get('name')
    

    此行返回一个字符串,即“Winnipeg Jets”。 快速解决方法是先初始化 game_dict_2017,然后将 dict 键设置为团队名称。

    示例:

        game_dict_2017 = dict()
        game_dict_2017['teamname'] = game_data_2017.get('teams').get(homeaway).get('team').get('name')
        game_dict_2017['homeaway'] = homeaway
        game_dict_2017['game_id'] = 2017020001
        games_played.append(game_dict_2017)
    

    【讨论】:

      【解决方案3】:
          game_dict_2017 = game_data_2017.get('teams').get(homeaway).get('team').get('name')
          game_dict_2017['homeaway'] = homeaway
          game_dict_2017['game_id'] = game_id
      

      这就是问题所在。

      你定义game_dict_2017,我想它是一个字符串。然后尝试将其用作字典,我想您弄乱了game_dict_2017game_data_2017

      【讨论】:

        猜你喜欢
        • 2013-12-22
        • 1970-01-01
        • 2016-05-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-22
        • 1970-01-01
        相关资源
        最近更新 更多