You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python函数传参报错求助:自定义BeautifulSoup参数冲突问题

问题分析与解决方案

核心错误原因

你自定义的函数名BeautifulSoup和从bs4导入的解析类完全重名,导致函数内部调用BeautifulSoup(...)时,实际调用的是你自己写的单参数函数,而非bs4需要两个参数的解析类,这就是报错「BeautifulSoup() takes 1 positional argument but 2 were given」的根源。

除此之外,代码还有其他几个问题需要修正:

具体问题与修复步骤

  1. 重命名自定义函数
    把自定义的BeautifulSoup函数改名,比如叫get_channel_details,避免和导入的类冲突。

  2. 补充缺失的模块导入
    代码中用到了re正则和json解析,但没导入这两个模块,需要在开头添加:

    import re
    import json
    
  3. 清理冗余参数
    vVersion函数定义的*arg参数没有实际作用,直接删除即可。

  4. 修正函数调用与返回值逻辑

    • 自定义的渠道信息函数不要直接打印结果,改为返回数据,方便后续使用;
    • 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 16:25:22