Scrapy:NameError:未定义名称“ URL”

时间:2018-08-10 03:12:57

标签: python scrapy

当我在Scrapy Spider类中设置start_urls时,可以使用以下代码:

class InfoSpider(scrapy.Spider):
    name = 'info'
    allowed_domains = ['isbn.szmesoft.com']
    isbns = list(set(pd.read_csv('E:/books.csv')['ISBN']))
    url = 'http://isbn.szmesoft.com/isbn/query?isbn='
    start_urls = [url + isbns[0]]

但是当我按如下方式重写代码时,出现了错误Scrapy: NameError: name 'url' is not defined

class InfoSpider(scrapy.Spider):
    name = 'info'
    allowed_domains = ['isbn.szmesoft.com']
    isbns = list(set(pd.read_csv('E:/books.csv')['ISBN']))
    url = 'http://isbn.szmesoft.com/isbn/query?isbn='
    start_urls = [url + isbn for isbn in isbns[:3]]

也许我可以通过其他方式解决此问题,但我想知道发生错误的原因

3 个答案:

答案 0 :(得分:2)

Python中只有四个范围:public abstract class MessageBase { } public class Message1D : MessageBase { } public class Message2D : MessageBase { } public interface IFoo<out T> where T : MessageBase { } public class Bar : IFoo<Message1D> { } public class Baz : IFoo<Message2D> { } public class Network { private List<IFoo<MessageBase>> messages = new List<IFoo<MessageBase>>(); public void AddBar() { messages.Add(new Bar()); } public void AddBaz() { messages.Add(new Baz()); } } ,因为LEGB定义的局部范围和class的局部范围不是嵌套函数,因此它们不会形成封闭范围。

因此,它们是两个不能彼此访问的独立本地作用域。

答案 1 :(得分:0)

尝试做__init__

class InfoSpider(scrapy.Spider):
    def __init__(self):
        self.name = 'info'
        self.allowed_domains = ['isbn.szmesoft.com']
        self.isbns = list(set(pd.read_csv('E:/books.csv')['ISBN']))
        self.url = 'http://isbn.szmesoft.com/isbn/query?isbn='
        self.start_urls = [url + isbn for isbn in isbns[:3]]

然后,当您调用它时,先执行self.

答案 2 :(得分:0)

您需要传递它的字符串并尝试打印url,以便您也可以在浏览器中检查ut是否确实存在。

start_urls = [url + str(isbn) for isbn in isbns[:3]]
print(start_urls)