当我在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]]
也许我可以通过其他方式解决此问题,但我想知道发生错误的原因
答案 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)