Python函数传参报错求助:自定义BeautifulSoup参数冲突问题
问题分析与解决方案
核心错误原因
你自定义的函数名BeautifulSoup和从bs4导入的解析类完全重名,导致函数内部调用BeautifulSoup(...)时,实际调用的是你自己写的单参数函数,而非bs4需要两个参数的解析类,这就是报错「BeautifulSoup() takes 1 positional argument but 2 were given」的根源。
除此之外,代码还有其他几个问题需要修正:
具体问题与修复步骤
重命名自定义函数
把自定义的BeautifulSoup函数改名,比如叫get_channel_details,避免和导入的类冲突。补充缺失的模块导入
代码中用到了re正则和json解析,但没导入这两个模块,需要在开头添加:import re import json清理冗余参数
vVersion函数定义的*arg参数没有实际作用,直接删除即可。修正函数调用与返回值逻辑
- 自定义的渠道信息函数不要直接打印结果,改为返回数据,方便后续使用;
print()函数返回的是None,不能赋值给变量后当作函数调用,直接调用自定义函数即可。
修正后的完整代码
from urllib.request import urlopen from bs4 import BeautifulSoup import requests import re import json from pytube import YouTube from pytube import Channel channelURL = "videoURL" # 替换为实际视频URL YouTubeDomain = "https://www.youtube.com/channel/" def get_channel_details(Link): # 这里调用的是bs4的BeautifulSoup类,不再和自定义函数重名 soup = BeautifulSoup(requests.get(Link, cookies={'CONSENT': 'YES+1'}).text, "html.parser") data = re.search(r"var ytInitialData = ({.*});", str(soup.prettify())).group(1) json_data = json.loads(data) channel_id = json_data["header"]["c4TabbedHeaderRenderer"]["channelId"] channel_name = json_data["header"]["c4TabbedHeaderRenderer"]["title"] channel_logo = json_data["header"]["c4TabbedHeaderRenderer"]["avatar"]["thumbnails"][2]["url"] channel_id_link = YouTubeDomain + channel_id # 返回数据而非直接打印,提高复用性 return { "channel_id": channel_id, "channel_name": channel_name, "channel_logo": channel_logo, "channel_id_link": channel_id_link } def vVersion(): YTV = YouTube(channelURL) channel_id_link = YTV.channel_url c = Channel(channel_id_link) channel_name = c.channel_name return channel_id_link, channelURL # 获取渠道链接 channel_id_link, video = vVersion() print(f"渠道链接: {channel_id_link}") # 获取并打印渠道详情 channel_info = get_channel_details(channel_id_link) print(f"Channel ID: {channel_info['channel_id']}") print(f"Channel Name: {channel_info['channel_name']}") print(f"Channel Logo: {channel_info['channel_logo']}") print(f"Channel Link: {channel_info['channel_id_link']}")
额外说明
- 记得把
channelURL替换为实际的YouTube视频URL; - 自定义函数返回字典格式的数据,后续可以更灵活地使用这些信息,而不是局限于直接打印;
- 函数命名要遵循见名知意的原则,避免和库中的类/函数重名,这是编码的基础规范之一。
内容的提问来源于stack exchange,提问作者flyinggoatman
相关产品推荐
相关产品推荐

