如何选择正确的 class (NameError)

How to pick up the correct class (NameError)

我一直在做一个项目,我想在这个项目中收集 url,然后我可以用 scraper classes 导入所有模块,它应该将所有模块都注册到列表中。

我目前已经完成:

import sys
import tldextract


class Scraper:
    scrapers = {}

    def __init_subclass__(scraper_class):
        Scraper.scrapers[scraper_class.url] = scraper_class # .url -> Unresolved attribute reference 'url' for class 'Scraper' 

    @classmethod
    def for_url(cls, url):
        k = tldextract.extract(url)
        return scrapers[k.domain]() #<-- Unresolved reference 'scrapers' 


class BBCScraper(Scraper):
    url = 'bbc.co.uk'

    def scrape(s):
        print(s)
        # FIXME Scrape the correct values for BBC
        return "Yay works!"


url = 'https://www.bbc.co.uk/'
scraper = Scraper.for_url(url)
scraper.scrape("yay")

我现在的问题是我无法继续执行代码,因为我无法 return scrapers[k.domain]()

Output >>> NameError: name 'scrapers' is not defined

我想知道如何才能找到正确的 class 例如,如果 URL 是 bbc,它应该进入 BBCScraper class 然后我们调用 scrape稍后将 return 在该特定网站上抓取的值

按照您在 __init_subclass__ 中所做的操作或使用 cls.scrapers

@classmethod
def for_url(cls, url):
    k = tldextract.extract(url)
    return Scraper.scrapers[k.domain]() 
    # or
    return cls.scrapers[k.domain]() 

关于第二期

  1. 请在单独的问题中提问
  2. 请更好地解释你到底想做什么