Python 如何在scrapy中使用限制文本?

Python 如何在scrapy中使用限制文本?,python,regex,scrapy,web-crawler,Python,Regex,Scrapy,Web Crawler,我的目标是只从网站的一部分(一个HTML节点)提取链接 从域名'quotes.toscrape.com'中,我想提取其中包含'page'的链接。例如: 我试图通过将正则表达式中的“page”传递给以下规则来实现这一点:allow、allow\u domain和restrict\u text。我使用了这些正则表达式组合(r'page',r'/page/',r'[^]page[^]',r'.*page.*')等等。最后两个根据需要工作良好。它们在我的代码中似乎都不起作用 下面您可以看到最新的执行情况

我的目标是只从网站的一部分(一个HTML节点)提取链接

从域名'quotes.toscrape.com'中,我想提取其中包含'page'的链接。例如:

我试图通过将正则表达式中的“page”传递给以下规则来实现这一点:allow、allow\u domain和restrict\u text。我使用了这些正则表达式组合(r'page',r'/page/',r'[^]page[^]',r'.*page.*')等等。最后两个根据需要工作良好。它们在我的代码中似乎都不起作用

下面您可以看到最新的执行情况

class MySpider(CrawlSpider):
    name = 'quotes.toscrape.com'
    allowed_domains = ['quotes.toscrape.com']
    start_urls = ['http://quotes.toscrape.com/']

    rules = (
        Rule(LinkExtractor(restrict_text=r'.*page.*'), callback='parse'),
    )

    def parse(self, response):
        for span in response.css('span'):
            yield {
                'span': span.css('span::text').get(),
            }
        for div in response.css('div'):
            yield {
                'div': div.css('div::text').get(),
            }
        next_url_path = response.css(
            "a::attr('href')").extract()
        for item in next_url_path:
            yield scrapy.Request(response.urljoin(item), callback=self.parse)
摘自零碎的文档:

restrict_text(正则表达式(或正则表达式列表))–链接文本必须匹配才能提取的单个正则表达式(或正则表达式列表)。如果没有给出(或为空),它将匹配所有链接。如果给定了正则表达式列表,则如果链接至少与一个匹配,则将提取该链接


如果您能告诉我如何正确使用restrict_text或任何其他规则来达到相同的目的,我将不胜感激。

您的正则表达式是正确的,问题在于其他方面。 您的代码有一些小问题

我将代码更改为:

import scrapy
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor


class MySpider(CrawlSpider):
    name = 'quotes.toscrape.com'
    allowed_domains = ['quotes.toscrape.com']
    start_urls = ['http://quotes.toscrape.com/']

    rules = (
        Rule(LinkExtractor(allow=r'.*page.*'),
             callback='parse_page', follow=True),
    )

    def parse_page(self, response):
        yield {'url': response.url} # It just for test. can be omitted.
        for span in response.css('span'):
            yield {
                'span': span.css('span::text').get(),
            }
        for div in response.css('div'):
            yield {
                'div': div.css('div::text').get(),
            }
首先在
LinkExtractor
中,您必须使用
allow=
而不是
restrict\u text=
,因为
allow=
用于URL,而
restrict\u text=
用于链接的文本,而不是URL

其次,由于以下警告,您无法调用
parse
方法:

在编写爬行爬行器规则时,避免使用parse作为回调,因为爬行爬行器使用parse方法本身来实现其逻辑。因此,如果重写解析方法,爬行爬行器将不再工作

因此,我将
parse
更改为
parse\u页面
,并重新调用它

第三,您不必在
parse
方法中提取链接并从中发送请求<代码>爬行蜘蛛自动执行该操作。手动从parse方法发送的请求不遵循您定义的
规则

最后,我建议使用这个正则表达式。它更简单、更常见:

rules = (
        Rule(LinkExtractor(allow='page'),
             callback='parse_page', follow=True),
    )

祝你好运

您的正则表达式是正确的,问题在于其他方面。 您的代码有一些小问题

我将代码更改为:

import scrapy
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor


class MySpider(CrawlSpider):
    name = 'quotes.toscrape.com'
    allowed_domains = ['quotes.toscrape.com']
    start_urls = ['http://quotes.toscrape.com/']

    rules = (
        Rule(LinkExtractor(allow=r'.*page.*'),
             callback='parse_page', follow=True),
    )

    def parse_page(self, response):
        yield {'url': response.url} # It just for test. can be omitted.
        for span in response.css('span'):
            yield {
                'span': span.css('span::text').get(),
            }
        for div in response.css('div'):
            yield {
                'div': div.css('div::text').get(),
            }
首先在
LinkExtractor
中,您必须使用
allow=
而不是
restrict\u text=
,因为
allow=
用于URL,而
restrict\u text=
用于链接的文本,而不是URL

其次,由于以下警告,您无法调用
parse
方法:

在编写爬行爬行器规则时,避免使用parse作为回调,因为爬行爬行器使用parse方法本身来实现其逻辑。因此,如果重写解析方法,爬行爬行器将不再工作

因此,我将
parse
更改为
parse\u页面
,并重新调用它

第三,您不必在
parse
方法中提取链接并从中发送请求<代码>爬行蜘蛛
自动执行该操作。手动从parse方法发送的请求不遵循您定义的
规则

最后,我建议使用这个正则表达式。它更简单、更常见:

rules = (
        Rule(LinkExtractor(allow='page'),
             callback='parse_page', follow=True),
    )
祝你好运