python - Scrapy - 在未返回项目字段之一时处理异常

标签 python exception web-scraping scrapy

我正在尝试解析 Scrapy 项目,其中每个项目都有多个字段。碰巧由于网站上的信息不完整,某些字段无法正确捕获。如果只有一个字段无法返回,则提取项目的整个操作会异常中断(例如,对于下面的代码,我得到“Attribute:None cannot be 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。我可以尝试...除了...在每个项目字段上,但这似乎不是最佳解决方案。文档提到了异常处理,但不知何故我找不到解决这种情况的方法。

最佳答案

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

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

此处更好的选择可能是将项目字段解析逻辑委托(delegate)给 Item Loaders和不同Input and Output Processors .这样你的蜘蛛将只负责解析 HTML 和提取所需的数据,但所有的后处理和美化都将由 Item Loader 处理。换句话说,在你的蜘蛛中,你只会有:

loader = MyItemLoader(response=response)

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

loader.load_item()

Item Loader 会是这样的:

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)

关于python - Scrapy - 在未返回项目字段之一时处理异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33332370/

相关文章:

Java smartcardio APDU 响应超时

asp.net - 如何跟踪应用程序中的异常

python - 为函数中的异常引发自定义消息

ajax - 用于调用 ajax 的按钮的 Symfony Crawler

python - 在Scrapy中养CloseSpider有什么影响?

python - 在 tkinter 中读取、操作和显示文本文件

python - 扭曲的Python+spawnProcess。从命令获取输出

python - BeautifulSoup 在 Amazon EC2 机器上表现不同

python - 在图书馆中寻找正确的方法

python - 如何使用 Python 的 PySphere 获取 VmWare Workstation VM