如何使用scrapy限制xpath

bqf10yzr  于 2023-08-05  发布在  其他
关注(0)|答案(1)|浏览(101)

我想限制一些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,
            }

字符串

yyhrrdl8

yyhrrdl81#

你的蜘蛛有一些问题。

  1. Rule对象是无用的,除非它是crawlspider的属性。如果你只是想使用一个LinkExtractor,那么你可以不用把它 Package 在Rule对象中。
  2. LinkExtractor从选择器中提取链接,因此您应该在restrict_xpaths选择器列表的末尾包含@href
    1.这是您收到的错误的原因:一个Request对象只需要一个位置参数,即url。如果它接收到第二个位置参数,则假定该值是回调。然而在你的例子中,你有url作为第一个参数,其他的作为第二个参数,回调是关键字参数,所以它会抛出一个错误,因为它收到了回调参数的多个值。请求对象也不接受Rule对象作为参数。
    要解决这些问题,您可以直接示例化LinkExtractor,删除xpath的@href部分,然后迭代提取的链接并为每个单独提取的链接生成一个Request。
    举例来说:
def parse(self, response):
        for link in LinkExtractor(restrict_xpaths=[
            '//table[@class="categories"]//tr//td[1]//a[@class="category"]'
        ]).extract_links(response):
            url = response.urljoin(link.url)
            yield Request(url,callback=self.base_url)

字符串

相关问题