通过条件字典循环时逻辑评估误差



我正在循环浏览带有废除网页的列表。我刮擦的一些页面是错误的。我想跟踪各种错误类型,因此我已经设置了我的功能,以首先检查一系列错误条件(我将其放置在字典中是真实的,并且如果没有任何错误条件是正常的页面刮擦:

def parse_detail_page(self, response):
    error_value = False
    output = ""
    error_cases = {
        "' pageis not found' in response.body" : 'invalid',
        "'has been transferred' in response.body" : 'transferred',
    }
    for key, value in error_cases.iteritems():
        if bool(key):
            error_value = True
            output = value
    if error_value:
        for field in J1_Item.fields:
            if field == 'case':
                item[field] = id
            else:
                item[field] = output
    else:
        item['case'] = id
        ........................

但是,我看到,即使在错误案例中都没有有效的情况下,"无效"选项仍在选择中。我究竟做错了什么?

未评估您的条件(something in response.body)。相反,您可以评估非空字符串的真实价值,即True

这可能有效:

def parse_detail_page(self, response):
    error_value = False
    output = ""
    error_cases = {
        "pageis not found" : 'invalid',
        "has been transferred" : 'transferred',
    }
    for key, value in error_cases.iteritems():
        if key in response.body:
            error_value = True
            output = value
            break
.................

(必须找到"找不到页面"或"找不到页面"?)

bool(键)将键从字符串转换为布尔。

它不会做的是实际评估情况。您可以为此使用eval(),但我建议您代替存储一个函数列表(每个函数返回对象或抛出异常),而不是您当前的dict-with-with-with-string-keys-the-at-at-at-at-at-atal-atally-python-代码。

我不确定为什么您会像以前一样评估布尔(键)。让我们看一下您的error_case。您有两个键和两个值。"' pageis not found' in response.body"将是您的第一次关键,而"'has been transferred' in response.body"将是您的第二轮循环中的关键。当您检查bool(键)时,这些都不是错误的,因为键具有false以外的值或0。

>>> a = "' pageis not found' in response.body"
>>> bool(a)
True

您需要有不同的评估符(键)(键),否则您将始终有错误。

您的条件是字符串,因此无法对其进行评估。您可以使用eval(key)功能评估字符串,这是不安全的。

在操作员模块的帮助下,无需评估不安全的字符串(只要您的条件保持很简单)。

错误['ocerator']具有"包含"函数的引用,可以用作替代" in"。

from operator import contains
class ...:
    def parse_detail_page(self, response):
        error_value = False
        output = ""
        error_cases = [
            {'search': ' pageis not found', 'operator': contains, 'output': 'invalid' },
            {'search': 'has been transferred', 'operator': contains, 'output': 'invalid' },
        ]

        for error in error_cases:
            if error['operator'](error['search'], response.body):
                error_value = True
                output = error['output']
        print output
        if error_value:
            for field in J1_Item.fields:
                if field == 'case':
                    item[field] = id
                else:
                    item[field] = output
        else:
            item['case'] = id
            ...

相关内容

  • 没有找到相关文章

最新更新