【问题标题】:How to fill excepted fields with blanks without repeated code?如何在没有重复代码的情况下用空白填充例外字段?
【发布时间】:2020-09-22 15:42:31
【问题描述】:

我正在运行一个网络抓取程序,该程序从网站中抓取某些数据字段,但是我不能保证所有字段都会出现在给定页面上。如果字段不存在,则应为空白。就目前而言,我的代码如下所示

try:
    field1 = scrape_data_field1(field1)
except NotOnPageError:
    field1 = ""

try:
    field2 = scrape_data_field2(field2)
except NotOnPageError:
    field2 = ""

try:
    field3= scrape_data_field3(field3)
except NotOnPageError:
    field3 = ""

我不能将这些字段组合在同一个 try-except 块中,因为这样即使缺少一个,它们也会全部填写为空白。这个问题有没有比我目前正在做的笨重的更优雅的解决方案?如果相关,我将使用 selenium 从页面中抓取数据。

【问题讨论】:

    标签: python selenium exception


    【解决方案1】:

    您是否考虑过将field 变量绑定到可迭代结构中的相关函数?这将允许您迭代结构并将相同的逻辑应用于函数/变量集。

    以下方法似乎可以很好地解决您的问题,因为将所有这些逻辑放在一个 try/except 结构中是不合适的,因为引发的第一个异常必然会进一步停止正在尝试的字段 - 正如您在原始帖子中突出显示的那样。

    field_mapping = [
    {"field": field1, "function": scrape_data_field1},
    {"field": field2, "function": scrape_data_field2},
    {"field": field3, "function": scrape_data_field3}
    ]
    
    for m in field_mapping:
        try:
            m["function"](m["field"])
        except NotOnPageError:
            m["field"] = ""
    

    如您所见,此解决方案实质上将每个field 与其对应的scrape_data_field 函数分组为dict 中的值。这些dict 结构存储在可以迭代的list 中,以便可以将相同的逻辑应用于每个变量/函数配对 - 即每个函数都使用在运行时传递的配对field 数据执行。

    【讨论】:

    • 啊,我现在意识到我问的问题有点错误。我不能对每个字段使用相同的 scrape_data() 函数。查询实际上略有不同,我应该明确说明(即 field1 = scrape_field1() 等)考虑到您已经回答了我提出的问题,我应该修改问题还是接受这个答案?
    • 我会修改这个问题,我会根据变化循环更新/删除我的答案。不幸的是,我现在才离开家,怀疑我是否有机会在明天之前回答问题的任何更新。
    • @JoshZwiebel 只是为了让您知道,我已经根据您在此处概述的更改以及您对 OP 的编辑更新了我的答案。
    【解决方案2】:

    一种策略可能是创建一个函数,该函数接受函数scrape_data_field1 和参数“field1”并返回try except 的结果。

    def try_execpt_scrape_data(field, _function):
        try:
            field_out = _function(field)
        except:
            field_out = ""
    
        return field_out
    
    def _function(argument):
        return_this = argument * argument
        return return_this
    
    field1 = 3
    
    field_out = try_execpt_scrape_data(field1, _function)
    print(field_out)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-03
      • 2017-04-20
      • 2013-03-26
      • 1970-01-01
      • 2022-11-22
      相关资源
      最近更新 更多