Tur*_*uro 4 python exception-handling scrapy web-scraping
我正在尝试解析 Scrapy 项目,其中每个项目都有几个字段。碰巧由于网站上的信息不完整,某些字段无法正确捕获。如果只有一个字段无法返回,则提取项目的整个操作会因异常而中断(例如,对于下面的代码,我得到“Attribute:None can be split”)。然后解析器移动到下一个请求,而不捕获其他可用字段。
item['prodcode'] = response.xpath('//head/title').re_first(r'.....').split(" ")[1]
#throws: Attribute:None cannot be split . Does not parse other fields.
Run Code Online (Sandbox Code Playgroud)
Scrapy 处理此类异常的方法是什么?我想从所有可用字段中检索信息,而不可用字段返回空白或 N/A。我可以尝试...除了...在每个项目字段上,但这似乎不是最佳解决方案。文档提到了异常处理,但不知何故我找不到这种情况的方法。
这里最天真的方法是遵循EAFP 方法并直接在蜘蛛中处理异常。例如:
try:
item['prodcode'] = response.xpath('//head/title').re_first(r'.....').split(" ")[1]
except AttributeError:
item['prodcode'] = 'n/a'
Run Code Online (Sandbox Code Playgroud)
这里更好的选择可能是将项目字段解析逻辑委托给项目加载器和不同的输入和输出处理器。这样你的蜘蛛就只负责解析 HTML 和提取所需的数据,但所有的后处理和美化都将由项目加载器处理。换句话说,在你的蜘蛛中,你只会有:
loader = MyItemLoader(response=response)
# ...
loader.add_xpath("prodcode", "//head/title", re=r'.....')
# ...
loader.load_item()
Run Code Online (Sandbox Code Playgroud)
项目加载器将具有以下内容:
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)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1624 次 |
| 最近记录: |