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