我试图通过提取所有链接中的“huis”(=荷兰语中的“house”)来搜索网站。关注http://doc.scrapy.org/en/latest/topics/spiders.html,我正在尝试
import scrapy
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor
from Funda.items import FundaItem
class FundaSpider(scrapy.Spider):
name = "Funda"
allowed_domains = ["funda.nl"]
start_urls = [
"http://www.funda.nl/koop/amsterdam/"
]
rules = (
Rule(LinkExtractor(allow=r'.*huis.*', callback='parse_item'))
)
def parse_item(self, response):
item = FundaItem()
item['title'] = response.extract()
return item
但是,我收到错误消息
Rule(LinkExtractor(allow=r'.*huis.*', callback='parse_item'))
TypeError: __init__() got an unexpected keyword argument 'callback'
从上一篇文章(Scrapy Error: TypeError: __init__() got an unexpected keyword argument 'deny')看,可能的原因是括号不匹配,因此关键字会传递给Rule
而不是LinkExtractor
。在我看来,在这种情况下,callback
符合预期的LinkExtractor
括号。
任何想法导致此错误的原因是什么?
答案 0 :(得分:3)
是的,callback
肯定会传递给LinkExtractor
。实际上,这似乎是问题所在,因为我在the documentation中的该类的预期参数下看不到callback
。
我看到Rule
类 在文档中列出了回调参数。那么也许你假设将它传递给Rule而不是LinkExtractor?
Rule(LinkExtractor(allow=r'.*huis.*'), callback='parse_item')
如果您正在思考"但为什么链接问题的回答者将callback
置于LinkExtractor
电话中?",我认为您可能会误解括号的嵌套,这无疑是有点令人困惑的。改变布局使它更清晰:
rules = (
Rule(
LinkExtractor(
allow=[r'/*'],
deny=('blogs/*', 'videos/*', )
),
callback='parse_html'
),
)