scrapy 如何处理Python中的特定错误消息

lb3vh1jj  于 2022-11-09  发布在  Python
关注(0)|答案(2)|浏览(135)

有时我会收到以下消息:

in process_item item['external_link_rel'] = dict_["rel"]
KeyError: 'rel'

一定是因为它根本不存在。我试着管理,但失败了。

from lxml import etree

class CleanItem():

def process_item(self, item, spider):

    try:
        root = etree.fromstring(str(item['external_link_body']).split("'")[1])
        dict_ = {}
        dict_.update(root.attrib)
        dict_.update({'text': root.text})
        item['external_link_rel'] = dict_["rel"]
        return item

    except KeyError as EmptyVar:
        if str(EmptyVar) == 'rel': 
            dict_["rel"] = "null"
            item['external_link_rel'] = dict_["rel"]
            return item

‍

最有可能的是,所有问题都是由于if str(EmptyVar) == 'rel'这一行造成的。
感谢您指导我仅在发生此错误时执行操作。
在提出这个问题之前,我做了大量的研究,没有得出结论
仅供参考,上述代码位于pipelines.pyScrapy框架内的www.example.com文件中

dauxcl2d

dauxcl2d1#

更好的方法是使用字典属性get

from lxml import etree

class CleanItem():
    def process_item(self, item, spider):
        root = etree.fromstring(str(item['external_link_body']).split("'")[1])
        dict_ = {}
        dict_.update(root.attrib)
        dict_.update({'text': root.text})
        item['external_link_rel'] = dict_.get("rel", "null")
        return item
yqlxgs2m

yqlxgs2m2#

为什么不直接使用条件语句呢?

from lxml import etree

class CleanItem():
    def process_item(self, item, spider):
        root = etree.fromstring(str(item['external_link_body']).split("'")[1])
        dict_ = {}
        dict_.update(root.attrib)
        dict_.update({'text': root.text})
        if 'rel' not in dict_:            # If 'rel' is not a key in dict
           dict_["rel"] = "null"          
           item['external_link_rel'] = dict_["rel"]  
           return item                    
        item['external_link_rel'] = dict_["rel"]  # else ...
        return item

如果你真的想使用try/except子句,你可以这样做。我永远不会推荐使用try/except子句,尽管它是不必要的。

def process_item(self, item, spider):
    root = etree.fromstring(str(item['external_link_body']).split("'")[1])
    dict_ = {}
    dict_.update(root.attrib)
    dict_.update({'text': root.text})
    try:
        item['external_link_rel'] = dict_["rel"]
        return item
    except KeyError:
        dict_["rel"] = "null"
        item['external_link_rel'] = dict_["rel"]
        return item

相关问题