Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/308.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-当其中一个项目字段未返回时处理异常_Python_Exception Handling_Web Scraping_Scrapy - Fatal编程技术网

Python Scrapy-当其中一个项目字段未返回时处理异常

Python Scrapy-当其中一个项目字段未返回时处理异常,python,exception-handling,web-scraping,scrapy,Python,Exception Handling,Web Scraping,Scrapy,我正在尝试解析零碎的条目,其中每个条目都有几个字段。由于站点上的信息不完整,某些字段可能无法正确捕获。如果只有一个字段无法返回,则提取项目的整个操作将中断,并出现异常(例如,对于下面的代码,我得到“Attribute:None cannot split”)。然后解析器移动到下一个请求,而不捕获其他可用字段 item['prodcode'] = response.xpath('//head/title').re_first(r'.....').split(" ")[1] #throws: Attr

我正在尝试解析零碎的条目,其中每个条目都有几个字段。由于站点上的信息不完整,某些字段可能无法正确捕获。如果只有一个字段无法返回,则提取项目的整个操作将中断,并出现异常(例如,对于下面的代码,我得到“Attribute:None cannot split”)。然后解析器移动到下一个请求,而不捕获其他可用字段

item['prodcode'] = response.xpath('//head/title').re_first(r'.....').split(" ")[1]
#throws: Attribute:None cannot be split . Does not parse other fields.

Scrapy如何处理此类异常?我想从所有可用字段中检索信息,而不可用字段返回空白或N/a。我可以尝试。。。除了在每个项目字段上,但这似乎不是最佳解决方案。文档中提到了异常处理,但不知何故,我找不到解决这种情况的方法。

这里最简单的方法是遵循规范,直接在spider中处理异常。例如:

try:
    item['prodcode'] = response.xpath('//head/title').re_first(r'.....').split(" ")[1]
except AttributeError:
    item['prodcode'] = 'n/a'
这里一个更好的选择是将项字段解析逻辑委托给和不同的对象。因此,您的spider将只负责解析HTML和提取所需的数据,但所有的后处理和修饰都将由项目加载器处理。换句话说,在你的蜘蛛中,你只有:

loader = MyItemLoader(response=response)

# ...
loader.add_xpath("prodcode", "//head/title", re=r'.....')
# ...

loader.load_item()
项目加载器的内容如下:

def parse_title(title):
    try:
        return title.split(" ")[1]
    except Exception:  # FIXME: handle more specific exceptions
        return 'n/a'

class MyItemLoader(ItemLoader):  
    default_output_processor = TakeFirst()

    prodcode_in = MapCompose(parse_title)

你能用一个例子来发布更多的代码吗?抱歉,James,这在中间得到了回答。谢谢