调用其他类方法触发TypeError:crawl()仅接受1个参数却传入2个
解决 TypeError: crawl() takes 1 positional argument but 2 were given
这个错误原因很直白——你定义的crawl方法只接受1个参数(类实例方法默认的self,用来指代当前实例本身),但调用时你手动传了额外的web参数,加上Python自动传入的实例本身,总共传了2个参数,自然就触发了参数数量不匹配的报错。
两种解决思路,根据你的实际需求选择:
1. 如果WebCrawler自身已具备可用的Web实例
你看你的WebCrawler类里已经初始化了web = Web()这个类属性,说明该类本身已经有可用的Web对象了。这种情况下调用时完全不需要额外传参,直接修改调用代码即可:
from web import Web from crawler import WebCrawler crawler = WebCrawler() urls = crawler.crawl() # 移除多余的web参数 print(urls)
2. 如果crawl方法确实需要外部传入的Web实例
那你得修改WebCrawler类里的crawl方法定义,新增对应的参数:
from web import Web import ast class WebCrawler: # 若不需要类共享的web实例,可删除此行 # web = Web() def crawl(self, web): # 新增web参数 root = self.root() # 注意:如果get方法需要用到传入的web实例,记得同步调整调用逻辑 URL = ast.literal_eval(self.get(root)) return URL
修改后,crawler.crawl(web)的调用方式就合法了。
另外提个小细节:你当前的web = Web()是类属性,所有WebCrawler实例会共享同一个Web对象。如果每个爬虫实例需要独立的Web实例,建议把它移到__init__方法里变成实例属性:
class WebCrawler: def __init__(self): self.web = Web() # 每个实例拥有独立的web对象 def crawl(self): root = self.root() URL = ast.literal_eval(self.get(root)) return URL
内容的提问来源于stack exchange,提问作者mchd
相关产品推荐
相关产品推荐

