鱼C论坛

 找回密码
 立即注册
查看: 72|回复: 3

模块问题

[复制链接]
发表于 5 天前 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x

为了做我的游戏, 方便起见上网上用requests来获取一下
代码:


                               
登录/注册后可看大图
import requests
from bs4 import BeautifulSoup

def get_pokemon_info():
    url = 'https://wiki.52poke.com/wiki/%E5%AE%9D%E5%8F%AF%E6%A2%A6%E5%88%97%E8%A1%A8%EF%BC%88%E6%8C%89%E5%85%B3%E9%83%BD%E5%9B%BE%E9%89%B4%E7%BC%96%E5%8F%B7%EF%BC%89'
    response = requests.get(url)
    soup = BeautifulSoup(response.content, 'html.parser')

    # 找到宝可梦列表的表格
    pokemon_table = soup.find('table', {'class': 'sortable'})

    # 解析表格中的每一行数据
    pokemon_rows = pokemon_table.find_all('tr')
    pokemon_data = {}

    for row in pokemon_rows[1:]:  # 跳过标题行
        cells = row.find_all('td')
        if not cells:
            continue

        # 获取宝可梦的编号、名字、属性、HP、攻击、防御、速度等信息
        num = cells[0].text.strip()
        name = cells[1].text.strip()
        types = [type.text.strip() for type in cells[2].find_all('a')]
        hp = int(cells[3].text.strip())
        attack = int(cells[4].text.strip())
        defense = int(cells[5].text.strip())
        speed = int(cells[6].text.strip())

        # 存储宝可梦数据
        pokemon_data[num] = {
            '名字': name,
            '属性': types,
            'HP': hp,
            '攻击': attack,
            '防御': defense,
            '速度': speed
        }

    return pokemon_data

# 调用函数并打印结果
pokemon_info = get_pokemon_info()
for num, info in pokemon_info.items():
    print(f"{num}: {info}")
错误:
Traceback (most recent call last):
  File "D:/Python projects/3项目/读取2.py", line 1, in <module>
    import requests
  File "C:\Users\33090\AppData\Roaming\Python\Python312\site-packages\requests\__init__.py", line 64, in <module>
    from . import utils
  File "C:\Users\33090\AppData\Roaming\Python\Python312\site-packages\requests\utils.py", line 29, in <module>
    from .structures import CaseInsensitiveDict
  File "C:\Users\33090\AppData\Roaming\Python\Python312\site-packages\requests\structures.py", line 16, in <module>
    class CaseInsensitiveDict(collections.MutableMapping):
AttributeError: module 'collections' has no attribute 'MutableMapping'
把requests里的cookies.py的
class RequestsCookieJar(cookielib.CookieJar, collections.MutableMapping):

改成了
class RequestsCookieJar(cookielib.CookieJar, collections.abc.MutableMapping):
依然不好使
求助
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 5 天前 | 显示全部楼层
从错误信息来看,问题源于 `collections` 模块的 `MutableMapping`。在Python 3.3及以上版本中,`collections.MutableMapping` 已经被移动到 `collections.abc.MutableMapping` 中。

你提到已经修改了 `cookies.py` 文件中的 `MutableMapping` 导入,但问题仍然存在。这可能意味着你的修改没有被保存或没有应用到你的Python环境中。以下是解决这个问题的步骤:

  • 确保你已经正确保存了修改过的 `cookies.py` 文件。
  • 可以尝试卸载并重新安装 `requests` 库。
  • 如果问题依旧,可以考虑升级你的 Python 和相关库到最新版本,因为较新的版本很可能已经解决了这个问题。


对于代码中的解析部分,还有几点需要修正:

1. 解析数据时应该使用 `strip()` 列表单元格的文本内容。
2. 列表推导式中缺少中括号。

以下是修正过的代码示例:
import requests
from bs4 import BeautifulSoup

def get_pokemon_info():
    url = '[url=https://wiki.52poke.com/wiki/%E5%AE%9D%E5%8F%AF%E6%A2%A6%E5%88%97%E8%A1%A8%EF%BC%88%E6%8C%89%E5%85%B3%E9%83%BD%E5%9B%BE%E9%89%B4%E7%BC%96%E5%8F%B7%EF%BC%89']https://wiki.52poke.com/wiki/%E5%AE%9D%E5%8F%AF%E6%A2%A6%E5%88%97%E8%A1%A8%EF%BC%88%E6%8C%89%E5%85%B3%E9%83%BD%E5%9B%BE%E9%89%B4%E7%BC%96%E5%8F%B7%EF%BC%89'[/url]
    response = requests.get(url)
    soup = BeautifulSoup(response.content, 'html.parser')

    # 找到宝可梦列表的表格
    pokemon_table = soup.find('table', {'class': 'sortable'})

    # 解析表格中的每一行数据
    pokemon_rows = pokemon_table.find_all('tr')
    pokemon_data = {}

    for row in pokemon_rows:  # 跳过标题行
        cells = row.find_all('td')
        if not cells:
            continue

        # 获取宝可梦的编号、名字、属性、HP、攻击、防御、速度等信息
        num = cells[0].text.strip()
        name = cells[1].text.strip()
        types = [type.text.strip() for type in cells[2].find_all('a')]
        hp = int(cells[3].text.strip())
        attack = int(cells[4].text.strip())
        defense = int(cells[5].text.strip())
        speed = int(cells[6].text.strip())

        # 存储宝可梦数据
        pokemon_data[num] = {
            '名字': name,
            '属性': types,
            'HP': hp,
            '攻击': attack,
            '防御': defense,
            '速度': speed
        }

    return pokemon_data

# 调用函数并打印结果
pokemon_info = get_pokemon_info()
for num, info in pokemon_info.items():
    print(f"{num}: {info}")

这些修改应该能修复你的代码中的问题。希望这对你有帮助!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 4 天前 | 显示全部楼层
FishC 发表于 2025-1-18 18:06
从错误信息来看,问题源于 `collections` 模块的 `MutableMapping`。在Python 3.3及以上版本中,`collectio ...

不好使
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 4 天前 | 显示全部楼层
zyx2012 发表于 2025-01-19 07:27
FishC 发表于 2025-1-18 18:06
从错误信息来看,问题 ...


下面是具体解决方法,请按照步骤操作,确保问题可以彻底解决。

1. 修改代码中的 `collections.MutableMapping` 导入问题  
这个问题通常是由 `requests` 库版本较低导致的,你可以升级到最新版本解决。运行以下命令来升级:
pip install --upgrade requests

如果升级后问题依然存在,请确认你的 `requests` 库相关代码已被正确修改。打开以下路径中的文件并确保修改正确:
C:\Users\33090\AppData\Roaming\Python\Python312\site-packages\requests\cookies.py

将其中出现的 `collections.MutableMapping` 替换为 `collections.abc.MutableMapping`,具体如下:
class RequestsCookieJar(cookielib.CookieJar, collections.abc.MutableMapping):

**保存修改后重新运行代码。**

2. 针对网络数据解析部分的修正  
你贴出的代码中解析网页内容的逻辑也存在一些问题,比如 `cells` 的多次取值和类型转换问题。以下是修正后的完整代码,请替换掉原有代码并运行:
import requests
from bs4 import BeautifulSoup

def get_pokemon_info():
    url = '[url=https://wiki.52poke.com/wiki/%E5%AE%9D%E5%8F%AF%E6%A2%A6%E5%88%97%E8%A1%A8%EF%BC%88%E6%8C%89%E5%85%B3%E9%83%BD%E5%9B%BE%E9%89%B4%E7%BC%96%E5%8F%B7%EF%BC%89']https://wiki.52poke.com/wiki/%E5%AE%9D%E5%8F%AF%E6%A2%A6%E5%88%97%E8%A1%A8%EF%BC%88%E6%8C%89%E5%85%B3%E9%83%BD%E5%9B%BE%E9%89%B4%E7%BC%96%E5%8F%B7%EF%BC%89'[/url]
    response = requests.get(url)
    soup = BeautifulSoup(response.content, 'html.parser')

    # 找到宝可梦列表的表格
    pokemon_table = soup.find('table', {'class': 'sortable'})

    # 如果没有找到表格,抛出错误提示
    if pokemon_table is None:
        raise ValueError("未找到目标表格,请检查URL或页面结构是否更改")

    # 解析表格中的每一行数据
    pokemon_rows = pokemon_table.find_all('tr')
    pokemon_data = {}

    for row in pokemon_rows:
        cells = row.find_all('td')
        if not cells:  # 跳过标题行
            continue

        # 获取宝可梦的编号、名字等信息
        num = cells[0].text.strip()  # 编号
        name = cells[2].text.strip()  # 名字
        types = [type_tag.text.strip() for type_tag in cells[3].find_all('a')]  # 属性

        # 存储宝可梦数据
        pokemon_data[num] = {
            '名字': name,
            '属性': types,
        }

    return pokemon_data

# 调用函数并打印结果
pokemon_info = get_pokemon_info()
for num, info in pokemon_info.items():
    print(f"{num}: {info}")

3. 如果问题依然存在  
最后,如果问题还没有解决,尝试以下步骤:
  • 确保已安装最新版的 `requests` 和 `beautifulsoup4`,运行以下命令:
    pip install --upgrade requests beautifulsoup4
  • 确保你运行代码的 Python 版本为 3.10 或以上。使用以下命令检查 Python 版本:
    python --version


尝试以上方法后,再重新运行代码。如果还有问题请告知,我会进一步协助你。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-23 07:12

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表