Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在scrapy downolader中间件中使用正则表达式_Python_Regex_Python 3.x_Scrapy_Scrapy Middleware - Fatal编程技术网

Python 在scrapy downolader中间件中使用正则表达式

Python 在scrapy downolader中间件中使用正则表达式,python,regex,python-3.x,scrapy,scrapy-middleware,Python,Regex,Python 3.x,Scrapy,Scrapy Middleware,我一直在尝试用Scrapy制作一个自定义中间件,它将使用regex标记包含特定模式的URL。简而言之,这里有一个异常列表,每个url都会根据它进行检查。但是,中间件无法正确识别异常(它总是为re.match()返回无结果) 我已经尝试在一个单独的脚本中实现regex,而且效果很好。我真的很想知道为什么会发生这种情况 以下是示例情况: 1) 蜘蛛 2) 设置: 3) 我的中间件(即middleware.py中的新类): 。 . 4) 这是我的记录器识别的一个示例: * 在中找不到https://

我一直在尝试用Scrapy制作一个自定义中间件,它将使用regex标记包含特定模式的URL。简而言之,这里有一个异常列表,每个url都会根据它进行检查。但是,中间件无法正确识别异常(它总是为re.match()返回无结果)

我已经尝试在一个单独的脚本中实现regex,而且效果很好。我真的很想知道为什么会发生这种情况

以下是示例情况:

1) 蜘蛛

2) 设置:

3) 我的中间件(即middleware.py中的新类):

。 .

4) 这是我的记录器识别的一个示例:

* 在中找不到https://www.amazon.co.uk/gp/help/customer/display.html/ref=footer_cookies_notice?ie=UTF8&nodeId=201890250> *

您的代码确实有效,您正在尝试匹配
有声有声读物下载
,它会为您问题中的url返回
,因为它不存在,这就是您看到的。然后检查url中是否存在
help
,它确实存在并且已经打印了该url

在下面的代码中,我检查
m
是否不是
None
,然后打印完全匹配

import logging
import re

exceptions = ['Audible-Audiobook-Downloads','help']

for i in exceptions:
    pattern = re.compile(r'[a-z0-9.:/-]+/{}/[0-9a-z.:/-]+'.format(re.escape(i)))

    m = pattern.match("https://www.amazon.co.uk/gp/help/customer/display.html/ref=footer_cookies_notice?ie=UTF8&nodeId=201890250")
    if m:
        print(m.group(0))

嗨,马克,谢谢你的建议。这就是问题所在,当我在一个单独的脚本中检查regex时,就像您提供的脚本一样,一切都很好。但当我在中间件中实现它时,问题就出现了。我是否在引用请求url的方式上犯了错误?此外,我正在使用Python 3.7,但也尝试运行3.5.3中的代码(将f“”更改为.format()),但结果是相同的。
BOT_NAME = 'foo'

SPIDER_MODULES = ['foo.spiders']
NEWSPIDER_MODULE = 'foo.spiders'

USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:63.0) Gecko/20100101 Firefox/63.0'

ROBOTSTXT_OBEY = False
DOWNLOADER_MIDDLEWARES = {
    'foo.middlewares.FooDownloaderMiddleware': 543,
    'foo.middlewares.TryMiddleware':500,
}
import logging
import re
class TryMiddleware(object):

def __init__(self):
    self.items_scraped = 0
    self.target = ''
    self.exceptions = []

@classmethod
def from_crawler(cls, crawler):
    s = cls()

    return s

def process_request(self, request, spider):
    self.target = str(request)

    # Just an example, at a later stage, these will be dynamically generated.
    self.exceptions = ['Audible-Audiobook-Downloads','help']

    for i in self.exceptions:
        pattern = re.compile(r'[a-z0-9.:/-]+/{}/[0-9a-z.:/-]+'.format(re.escape(i)))

        if i in self.target:
            m = pattern.match(self.target)
            # This is how I tried checking if the word is contained in the url,
            # and see if regex caught it.
            logger.info(f'\n*\nFound {m} in {target}\n*\n')

    return None
import logging
import re

exceptions = ['Audible-Audiobook-Downloads','help']

for i in exceptions:
    pattern = re.compile(r'[a-z0-9.:/-]+/{}/[0-9a-z.:/-]+'.format(re.escape(i)))

    m = pattern.match("https://www.amazon.co.uk/gp/help/customer/display.html/ref=footer_cookies_notice?ie=UTF8&nodeId=201890250")
    if m:
        print(m.group(0))