【问题标题】:Scrapy - handle exception when one of item fields is not returnedScrapy - 当项目字段之一未返回时处理异常
【发布时间】:2015-10-25 16:56:27
【问题描述】:

我正在尝试解析 Scrapy 项目,其中每个项目都有几个字段。由于网站上的信息不完整,某些字段无法正确捕获。如果只有一个字段无法返回,则提取项目的整个操作会因异常而中断(例如,对于下面的代码,我得到“属性:不能拆分”)。解析器然后移动到下一个请求,而不捕获其他可用字段。

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。我可以尝试...除了...在每个项目字段上,但这似乎不是最好的解决方案。文档提到了异常处理,但不知何故我找不到这种情况的方法。

【问题讨论】:

  • 您可以通过示例发布更多代码吗?
  • 抱歉,詹姆斯,这在两者之间得到了回答。谢谢!

标签: python exception-handling web-scraping scrapy


【解决方案1】:

这里最幼稚的方法是遵循EAFP approach 并直接在蜘蛛中处理异常。例如:

try:
    item['prodcode'] = response.xpath('//head/title').re_first(r'.....').split(" ")[1]
except AttributeError:
    item['prodcode'] = 'n/a'

这里更好的选择可能是将项目字段解析逻辑委托给Item Loaders 和不同的Input and Output Processors。这样您的蜘蛛将只负责解析 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)

【讨论】:

    猜你喜欢
    • 2022-01-18
    • 2012-06-19
    • 2013-09-14
    • 1970-01-01
    • 2016-01-06
    • 1970-01-01
    • 2021-12-01
    • 1970-01-01
    • 2022-06-22
    相关资源
    最近更新 更多