我想限制一些xpath使用Link Extractor
,但他们给了我这些错误you have multiple values for argument
请给予我一些建议,我在做什么错误
import scrapy
from scrapy.http imporrt Request
from selenium import webdriver
from scrapy.http import HtmlResponse
import time
from scrapy_selenium import SeleniumRequest
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
class BarSpider(scrapy.Spider):
name = 'bar'
start_urls=["https://www.veteranownedbusiness.com/?mode=geo#BrowseByState"]
def parse(self, response):
books = response.xpath('//table[@class="categories"]//tr//td//a[@class="category"]//@href').extract()
for book in books:
url = response.urljoin(book)
rules = (Rule(LinkExtractor(restrict_xpaths=('//table[@class="categories"]//tr//td[1]//a[@class="category"]//@href'))))
yield Request(url ,rules,callback='base_url')
def base_url(self,response):
links = response.xpath('//table[@class="listings"]//a//@href').extract()
for link in links:
b_link = response.urljoin(link)
yield{
'url':b_link,
}
字符串
1条答案
按热度按时间yyhrrdl81#
你的蜘蛛有一些问题。
Rule
对象是无用的,除非它是crawlspider
的属性。如果你只是想使用一个LinkExtractor,那么你可以不用把它 Package 在Rule对象中。LinkExtractor
从选择器中提取链接,因此您应该在restrict_xpaths
选择器列表的末尾包含@href
。1.这是您收到的错误的原因:一个Request对象只需要一个位置参数,即url。如果它接收到第二个位置参数,则假定该值是回调。然而在你的例子中,你有url作为第一个参数,其他的作为第二个参数,回调是关键字参数,所以它会抛出一个错误,因为它收到了回调参数的多个值。请求对象也不接受
Rule
对象作为参数。要解决这些问题,您可以直接示例化LinkExtractor,删除xpath的
@href
部分,然后迭代提取的链接并为每个单独提取的链接生成一个Request。举例来说:
字符串