如何根据URL域名调用对应爬虫类并解决KeyError报错问题
问题根因
报错的核心是tldextract返回字段和你存储爬虫类的key格式不匹配:
- 你给
BBCScraper定义的索引key是bbc.co.uk,这是完整的注册域名,对应tldextract.extract()返回值的k.registered_domain字段 - 你当前代码用的
k.domain仅会返回二级域名内容bbc,和字典里的key匹配不上,因此抛出KeyError。
修复方案
方案1(改动最小,推荐)
修改for_url方法的key取值逻辑,用registered_domain字段匹配即可:
@classmethod def for_url(cls, url): k = tldextract.extract(url) return cls.scrapers[k.registered_domain]()
该方案不需要调整现有子类的url属性定义,后续新增其他站点爬虫时,直接把对应站点的完整注册域名赋值给子类url属性即可正常匹配。
方案2(适配多后缀同站点场景)
如果你需要让bbc.co.uk、bbc.com等不同后缀的同主体站点都匹配到同一个爬虫类,可以统一用二级域名作为索引key,修改子类的url属性即可:
class BBCScraper(Scraper): url = 'bbc' def scrape(s): print(s) # FIXME Scrape the correct values for BBC return "Scraped BBC News"
可选容错优化
可以增加不存在对应爬虫类的异常判断,避免直接抛出KeyError影响体验:
@classmethod def for_url(cls, url): k = tldextract.extract(url) target_domain = k.registered_domain if target_domain not in cls.scrapers: raise NotImplementedError(f"暂未适配{target_domain}站点的爬取逻辑") return cls.scrapers[target_domain]()
内容的提问来源于stack exchange,提问作者PythonNewbie
相关产品推荐
相关产品推荐

