TypeError:不可散列的类型:Web爬网项目的“列表”

时间:2019-05-05 10:11:45

标签: python dictionary hash

我正在制作一个抓取此网站的程序。收集到的数据,仅是项目名称,可以在其上使用的平台以及价格。我已经为每个刮取的信息制作了一个数据结构。但是在创建字典时会提示我输入错误吗?

我正在使用python 3.7.2。在Windows 10上运行。

import requests
import bs4
import time
from bs4 import BeautifulSoup as Bsoup

url = "https://ebgames.com.au/search?q=Skyrim"
resp = requests.get(url)
soup = Bsoup(resp.text, 'html.parser')
platforms = soup.select(".product-top-level-group")
price = soup.select(".price")
names = soup.select(".product-title")
stripped_names = [na.text.strip() for na in names]
stripped_prices = [pri.text.strip() for pri in price]
stripped_platforms = [plat.text.strip() for plat in  platforms]




Game = {
    (stripped_names): {
        "Price": (stripped_prices),
        "Platform": [stripped_platforms]


    }
}

for Gamename, Gameinfo in Game.items():
    print(Gamename)
    print("Platform:", Gameinfo['Platform'])
    print("Price:", Gameinfo['Price'])
    print("\n")

这是我的错误:

"Platform": [stripped_platforms]
TypeError: unhashable type: 'list'

2 个答案:

答案 0 :(得分:2)

不确定从何处获得dict初始化语法,但这不是在Python中完成的方式。

这是使用zip的一种好方法:

stripped_names = ['Skyrim', 'Minecraft']
stripped_prices = ['$59.99', '$19.99']
stripped_platforms = ['PC', 'XBox One']

Game = {
    name: {
        "Price": price,
        "Platform": platform,
    } for name, price, platform in zip(
        stripped_names,
        stripped_prices,
        stripped_platforms,
    )
}

for Gamename, Gameinfo in Game.items():
    print(Gamename)
    print("Platform:", Gameinfo['Platform'])
    print("Price:", Gameinfo['Price'])
    print("\n")

输出:

Skyrim
Platform: PC
Price: $59.99


Minecraft
Platform: XBox One
Price: $19.99

答案 1 :(得分:1)

问题是您试图使用不可散列的键(此处为stripped_names)初始化字典(您可以阅读this来了解有关可散列对象的更多信息)。您可以将其变成tuple以使其可散列,或选择另一个键。

下次,别忘了发布您的错误的整个追溯,它将帮助人们更快更好地为您提供帮助。