【问题标题】:How do I reduce the number of try/catch statements here?如何在此处减少 try/catch 语句的数量?
【发布时间】:2014-07-09 15:31:34
【问题描述】:

我目前正在使用 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 语句。由于每个异常都特定于我要填充的字段,是否有更清洁的方法来解决这个问题?

【问题讨论】:

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


    【解决方案1】:

    使用TakeFirst()output processor

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

    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()
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-10-03
        • 2018-10-14
        • 2011-01-06
        • 2021-10-23
        • 2016-09-09
        • 1970-01-01
        • 1970-01-01
        • 2021-08-28
        相关资源
        最近更新 更多