【问题标题】:How to pick up the correct class (NameError)如何选择正确的班级(NameError)
【发布时间】:2021-08-12 13:24:00
【问题描述】:

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

我目前已经完成了:

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")

我目前的问题是我无法继续执行代码,因为我无法返回scrapers[k.domain]()

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

我想知道如果 URL 是 bbc,我该如何选择正确的类,例如,它应该进入 BBCScraper 类,然后我们调用 scrape,稍后将返回已在该特定位置上抓取的值网站

【问题讨论】:

    标签: python python-3.x class-variables


    【解决方案1】:

    按照您在 __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. 请更好地解释您到底想做什么

    【讨论】:

    • 我将创建一个关于第二个问题的新问题。我认为它可能不适合这里。使用 cls.scraper 和 Scraper.scrapers 有什么区别? :)
    • from this answer - 这在继承发挥作用时表现不同。这可能会影响您,具体取决于第二个问题。我认为对于这个特定的用例,这无关紧要。
    猜你喜欢
    • 2017-01-18
    • 1970-01-01
    • 2018-09-22
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 2022-01-10
    • 1970-01-01
    相关资源
    最近更新 更多