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

如何根据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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.19 17:45:02