【问题标题】:Silent erroer handling in python?python中的静默错误处理?
【发布时间】:2017-11-19 06:43:31
【问题描述】:

我得到了包含许多 URL 的 csv 文件。为方便起见,我将其读入熊猫数据框。稍后我需要做一些统计工作——熊猫很方便。它看起来有点像这样:

import pandas as pd
csv = [{"URLs" : "www.mercedes-benz.de", "electric" : 1}, {"URLs" : "www.audi.de", "electric" : 0}, {"URLs" : "ww.audo.e", "electric" : 0}, {"URLs" : "NaN", "electric" : 0}]
df = pd.DataFrame(csv)

我的任务是检查网站是否包含某些字符串,如果是,则添加一个额外的列,如果是,则为 1,否则为 0。例如:我想检查,www.mercedes-benz.de 是否包含字符串 car。我执行以下操作:

for i, row in df.iterrows():
    page_content = requests.get(row['URLs'])
    if "car" in page_content.text:
        df.loc[i, 'car'] = '1'
    else:
        df.loc[i, 'car'] = '0' 

问题是:有时 URL 错误/丢失。我的小脚本导致错误。

如果 URL 错误/丢失,我该如何处理/抑制错误?而且,我怎么能例如在这些情况下使用 df.loc[i, 'url_wrong'] = '1' 表示 URL 错误/丢失?

【问题讨论】:

    标签: python-3.x loops pandas error-handling get-request


    【解决方案1】:

    尝试定义一个首先执行“汽车”检查的函数,然后使用 pandas Series.apply 方法来获取您的 10Wrong URL。以下应该会有所帮助:

    import pandas as pd
    import requests
    
    
    data = [{"URLs" : "https://www.mercedes-benz.de", "electric" : 1},
            {"URLs" : "https://www.audi.de", "electric" : 0}, 
            {"URLs" : "https://ww.audo.e", "electric" : 0}, 
            {"URLs" : "NaN", "electric" : 0}]
    
    
    def contains_car(link):
        try:
            return int('car' in requests.get(link).text)
        except:
            return "Wrong/Missing URL"
    
    
    df = pd.DataFrame(data)
    
    df['extra_column'] = df.URLs.apply(contains_car)
    
    
    #                           URLs  electric extra_column
    # 0  https://www.mercedes-benz.de         1            1
    # 1           https://www.audi.de         0            1
    # 2             https://ww.audo.e         0    Wrong/Missing URL
    # 3                           NaN         0    Wrong/Missing URL
    

    编辑:

    您可以在 HTTP 请求的返回文本中搜索多个关键字。根据您设置的条件,这可以使用内置函数any 或内置函数all 来完成。使用any 意味着找到任何关键字都应该返回1,而使用all 意味着必须匹配所有关键字才能返回1。在以下示例中,我将any 与诸如以下的关键字一起使用“汽车”、“汽车”、“车辆”:

    import pandas as pd
    import requests
    
    
    data = [{"URLs" : "https://www.mercedes-benz.de", "electric" : 1},
            {"URLs" : "https://www.audi.de", "electric" : 0}, 
            {"URLs" : "https://ww.audo.e", "electric" : 0}, 
            {"URLs" : "NaN", "electric" : 0}]
    
    
    def contains_keywords(link, keywords):
        try:
            output = requests.get(link).text
            return int(any(x in output for x in keywords))
        except:
            return "Wrong/Missing URL"
    
    
    df = pd.DataFrame(data)
    mykeywords = ('car', 'vehicle', 'automobile')
    df['extra_column'] = df.URLs.apply(lambda l: contains_keywords(l, mykeywords))
    

    应该让步:

    #                            URLs  electric       extra_column
    # 0  https://www.mercedes-benz.de         1                  1
    # 1           https://www.audi.de         0                  1
    # 2             https://ww.audo.e         0  Wrong/Missing URL
    # 3                           NaN         0  Wrong/Missing URL
    

    我希望这会有所帮助。

    【讨论】:

    • 嗨@abdou 是否可以使用or 运算符搜索多个关键字?我尝试了很多方法,但无法实现。我可以提出一个新问题,但我想我先在这里问..
    • 这是完美的。如果可以的话,我会给你另一个“问题”的答案!
    • @Rachel,我很高兴能帮上忙。
    【解决方案2】:

    我希望我能正确理解您,'NaN' 是一个“错误/缺失”的 URL。在这种情况下,您可以检查一下。有无数种方法可以指示丢失的 URL。我更喜欢 car 的缺失值:试试这个:

    import pandas as pd
    csv = [{"URLs" : "www.mercedes-benz.de", "electric" : 1}, {"URLs" : "www.audi.de", "electric" : 0}, {"URLs" : "ww.audo-car.e", "electric" : 0}, {"URLs" : "NaN", "electric" : 0}]
    df = pd.DataFrame(csv)
    
    print(df)
    
    for i, row in df.iterrows():
        page_content = row['URLs']
        if page_content is None or page_content is "NaN":
            df.loc[i, 'car'] = None
        elif "car" in page_content:
            df.loc[i, 'car'] = True
        else:
            df.loc[i, 'car'] = False 
        print(df.loc[i, 'car'])
    
    print(df)
    

    我在您的代码中编辑了更多内容,因为它们不起作用。例如,page_content = requests.get(row['URLs']) - requests 的这一行未定义。我猜你的意思是row

    【讨论】:

    • 谢谢!这是很大的帮助!
    猜你喜欢
    • 2018-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-11
    • 1970-01-01
    • 2017-01-07
    • 1970-01-01
    相关资源
    最近更新 更多