recherche

Maison  >  Questions et réponses  >  le corps du texte

python - Comment corriger l'erreur KeyError : "page" ?

def parse2csv(filepath):
    logfile = open(filepath,'r')

    source_ip_dict={}
    res_url_dict={}
    from_url_dict={}
    category_dict={}

    print('start.....')
    for line in logfile:
        line=line.strip()
        if line!="":
            source_ip = line.split('- -')[0].strip()
            if re.match('[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}',source_ip):
                if source_ip_dict.get(source_ip,'-')=='-':
                    source_ip_dict[source_ip]=1
                else:
                    source_ip_dict[source_ip]=source_ip_dict[source_ip]+1

            reg='"[GETPUOSHADINS]{3,8} /'
            url_start = re.compile(reg)
            re_result = url_start.findall(line)
            if len(re_result)>=1:
                res_url = '/'+line.split(re_result[0])[1].split(' ')[0]

                category = strip_detail(res_url.split('/'))
                if len(category)>=1:
                    if category[0] in ['article','item','question','topic','people','celebrity','brand','page','category']:
                        if category_dict.get(category[0],'-')=='-':
                            category_dict[category[0]]=1
                        else:
                            category_dict[category[0]]=category_dict[category[0]]+1

                if res_url.endswith('.jpg') or res_url.endswith('.css') or res_url.endswith('.js') or res_url.endswith('.png') or res_url.endswith('.gif'):
                    pass
                else:
                    if res_url.find(r'.css?')!=-1 or res_url.find(r'.js?')!=-1:
                        pass
                    else:
                        if res_url_dict.get(res_url,'-')=='-':
                            res_url_dict[res_url]=1
                        else:
                            res_url_dict[res_url]=res_url_dict[res_url]+1

            from_url_start =' "http://'
            if line.find(from_url_start)!=-1:
                from_url = 'http://'+line.split(from_url_start)[1].split('" ')[0]
                if from_url_dict.get(from_url,'-')=='-':
                    from_url_dict[from_url]=1
                else:
                    from_url_dict[from_url]=from_url_dict[from_url]+1



    logfile.close()
    yesterday = datetime.date.today()-datetime.timedelta(days=1)
    yesterday_str = str(yesterday).replace('-','')
    conn = pymysql.connect(host='127.0.0.1', user='fenxi',passwd='', db='rizhifenxi', port = 3306, charset = 'utf8')
                     
    cur = conn.cursor()
    cur.execute('insert into categort(yesterday_str, item, question, topic, people, celebrity, brand, page, category, article) values(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)', (yesterday_str, category['item'], category['question'], category['topic'], category['people'], category['celebrity'], category['brand'], category['page'], category['category'], category['article']))
        #temp = "insert into ipList(ipList) values ("+ ip_list[j] + ")"
        #print temp
        #print ('success connect')
    conn.commit()
    cur.close()
    conn.close()

Le code est comme ci-dessus

L'erreur est signalée comme suit :

root@iZbp1iqn00z9x3jov6bas1Z:/data/wwwlogs/www# python parselog2.py
/data/wwwlogs/www/m.xxx.com-access_20170419.log
start.....
Traceback (most recent call last):
  File "parselog2.py", line 145, in <module>
    parse2csv(filename)
  File "parselog2.py", line 92, in parse2csv
    cur.execute('insert into categort(yesterday_str, item, question, topic, people, celebrity, brand, page, category, article) values(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)', (yesterday_str, category['item'], category['question'], category['topic'], category['people'], category['celebrity'], category['brand'], category['page'], category['category'], category['article']))
TypeError: list indices must be integers or slices, not str
root@iZbp1iqn00z9x3jov6bas1Z:/data/wwwlogs/www#

Qu'est-ce qui ne va pas avec ça ? Je souhaite importer les résultats statistiques de la catégorie dans la base de données. Comment la modifier ?

Après avoir changé la catégorie encategory_dict, les autres valeurs sont normales, mais cette valeur échoue. Quelle en est la raison ?

cur.execute('insert into categort(yesterday_str, item, question, topic, people, celebrity, brand, page, category, article) values(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)', (yesterday_str, category_dict['item'], category_dict['question'], category_dict['topic'], category_dict['people'], category_dict['celebrity'], category_dict['brand'], 0, category_dict['category'], category_dict['article']))
KeyError: 'category'
PHPzPHPz2755 Il y a quelques jours1142

répondre à tous(2)je répondrai

  • 巴扎黑

    巴扎黑2017-05-18 11:02:41

    En regardant le message d'erreur, je suppose que votre type de catégorie est ici une liste, pas un dict. Vous ne pouvez pas obtenir la valeur comme catégorie['item']

    .

    répondre
    0
  • 習慣沉默

    習慣沉默2017-05-18 11:02:41

    Je soupçonne que vous avez écritcategory_dict commecategory

    répondre
    0
  • Annulerrépondre