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