从网上读取一个表格,想创建一个由字典组成的列表,字典key为列名。
错误写法
row_dict={}
dictlist=[]
...
for tr in first_table.find_all('tr'):
tds = tr.find_all('td')
n=0
for td in tds:
row_dict[colums[n]]= td.string
n=n+1
dictlist.append(row_dict)
print(dictlist)
结果
[{'Fuel': 'LPG', 'Price': '59.7', 'Name': '11-Seven Fairfield East', 'Suburb': 'Fairfield', 'State': 'VIC', 'Postcode': '3078'},
{'Fuel': 'LPG', 'Price': '59.7', 'Name': '11-Seven Fairfield East', 'Suburb': 'Fairfield', 'State': 'VIC', 'Postcode': '3078'},
{'Fuel': 'LPG', 'Price': '59.7', 'Name': '11-Seven Fairfield East', 'Suburb': 'Fairfield', 'State': 'VIC', 'Postcode': '3078'},
{'Fuel': 'LPG', 'Price': '59.7', 'Name': '11-Seven Fairfield East', 'Suburb': 'Fairfield', 'State': 'VIC', 'Postcode': '3078'},
{'Fuel': 'LPG', 'Price': '59.7', 'Name': '11-Seven Fairfield East', 'Suburb': 'Fairfield', 'State': 'VIC', 'Postcode': '3078'},
{'Fuel': 'LPG', 'Price': '59.7', 'Name': '11-Seven Fairfield East', 'Suburb': 'Fairfield', 'State': 'VIC', 'Postcode': '3078'}]
不管循环多少遍,只存储了最后一个字典,还把之前的都更新了。
在append之前打印row_dict地址试一下:
print(id(row_dict))
1860277256696
1860277256696
1860277256696
1860277256696
1860277256696
1860277256696
说明
每次添加的都是同一个内存地址到list中,row_dict每次写入的时候,改变了内存中的value,但是地址不变。即 只创建了一次内存空间,只会不断的改变value,添加到list中的时候value已经改了。
所以需要在for循环里面,每次循环append都创建一个空的dict,以保证之前添加过的不会被改变;或者复制row_dict到新的地址,再append。
正确写法一
dictlist.append(row_dict.copy())
print(id(row_dict.copy()))
1860286664496
1860277198280
1860277197776
1860286681736
1860286681448
1860277197848
正确写法二
dictlist=[]
...
for tr in first_table.find_all('tr'):
tds = tr.find_all('td')
row_dict={}
n=0
for td in tds:
row_dict[colums[n]]= td.string
n=n+1
dictlist.append(row_dict)
print(dictlist)
结果
[{'Fuel': 'E10', 'Price': '124.3', 'Name': '11-Seven Hallam', 'Suburb': 'Hallam', 'State': 'VIC', 'Postcode': '3803'},
{'Fuel': 'U91', 'Price': '125.3', 'Name': '11-Seven Southern River', 'Suburb': 'Southern River', 'State': 'WA', 'Postcode': '6110'},
{'Fuel': 'U95', 'Price': '137.3', 'Name': '11-Seven Southern River', 'Suburb': 'Southern River', 'State': 'WA', 'Postcode': '6110'},
{'Fuel': 'U98', 'Price': '127.7', 'Name': '11-Seven Waverley Gardens', 'Suburb': 'Mulgrave', 'State': 'VIC', 'Postcode': '3170'},
{'Fuel': 'Diesel', 'Price': '138.9', 'Name': '11-Seven Minto', 'Suburb': 'Minto', 'State': 'NSW', 'Postcode': '2566'},
{'Fuel': 'LPG', 'Price': '59.7', 'Name': '11-Seven Fairfield East', 'Suburb': 'Fairfield', 'State': 'VIC', 'Postcode': '3078'}]
网友评论