如何减少try / catch语句的数量?

时间:2014-07-09 15:31:34

标签: python python-2.7 web-scraping try-catch scrapy

我目前正在与Scrapy合作从网站上提取公司信息。但是,跨页面提供的数据量却大不相同;比如说,一家公司列出了三名团队成员,而另一家公司列出了两家,或者一家公司列出了它所在的位置,而另一家则没有。因此,某些XPath可能会返回null,因此尝试访问它们会导致错误:

try: 
    item['industry'] = hxs.xpath('//*[@id="overview"]/div[2]/div[2]/p/text()[2]').extract()[0]
except IndexError:
    item['industry'] = "None provided"
try:
    item['URL'] = hxs.xpath('//*[@id="ContentPlaceHolder_lnkWebsite"]/text()').extract()[0]
except IndexError:
    item['URL'] = "None provided"
try:
    item['desc'] = hxs.xpath('//*[@id="overview"]/div[2]/div[4]/p/text()[1]').extract()[0]
except IndexError:
    item['desc'] = "None provided"
try:
    item['founded'] = hxs.xpath('//*[@id="ContentPlaceHolder_updSummary"]/div/div[2]/table/tbody/tr/td[1]/text()').extract()[0]
except IndexError:
    item['founded'] = "None provided"

我的代码使用了许多try / catch语句。由于每个例外特定于我试图填充的字段,是否有更简洁的方法来解决这个问题?

2 个答案:

答案 0 :(得分:7)

使用TakeFirst() output processor

  

从接收的值返回第一个非null /非空值,   所以它通常用作单值字段的输出处理器。

from scrapy.contrib.loader.processor import TakeFirst

class MyItem(Item):
    industry = Field(output_processor=TakeFirst())
    ...

然后,在蜘蛛内部,根本不需要try/catch

item['industry'] = hxs.xpath('//*[@id="overview"]/div[2]/div[2]/p/text()[2]').extract()

答案 1 :(得分:0)

在最新版本中,extract-first()用于此。如果搜索没有返回任何内容,则返回None。因此,您将没有错误。