2013-06-01 2 views
1

Я делал простой скрипт, который находит панель администратора веб-сайта.
Я смог сделать это с помощью интерфейса командной строки, но я также хотел сделать простой gui с помощью easygui.
я часы делаем это, но я получаю эту ошибку в строке 33:
«TypeError: writelines требует итерации аргумента»TypeError: writelines() требует итеративного аргумента

Вот мой код:

import os, httplib 
import easygui as eg 

admpagelist = ['admin/','administrator/','admin1/','admin2/'] 

title = 'Test Easygui' 
msg='Enter Your Target: (without http://) ' 
value = [] 
value = eg.enterbox(msg,title) 
value = value.replace('Enter Your Target: (without http://)','') 

collectornf = [] 
collectorf = [] 

try: 
    con = httplib.HTTPConnection(value) 
    con.connect() 
except: 
    eg.msgbox('Host is offline or invalid url! ') 

for adm in admpagelist: 
    adm = '/%s' %adm 
    host = value + adm 
    con = httplib.HTTPConnection(value) 
    con.connect() 
    request = con.request('GET',adm) 
    response = con.getresponse() 
    if response.status == 200: 
     collectorf = collectorf.append(str(host)) 
     found = open('C:/Users/Andi/Desktop/found.txt','w') 
     found.writelines(collectorf) 
     found.close() 
    else: 
     collectornf = collectornf.append(str(host)) 
     notfound = open('C:/Users/Andi/Desktop/notfound.txt','w') 
     notfound.writelines(collectornf) 
     notfound.close() 
+0

Пожалуйста, разместите соответствующий код в ответе, вместо ссылки на него, и, пожалуйста, укажите * полное * исключение и трассировку стека. –

+0

Также обратите внимание, что при работе с файлами в Python вы всегда должны использовать [оператор 'with'] (http://www.youtube.com/watch?v=lRaKmobSXF4). Вы также должны всегда улавливать * явные * исключения. Использование 'except:' означает, что все исключения будут пойманы, маскировка проблем и сложность отладки. Только поймать точные исключения, которые вы знаете, придумают и знают, как обращаться, используя 'except SomeExplicitException:'. –

ответ

4

Вашего вопрос в том, что вы делаете collectorf = collectorf.append(str(host)).

list.append() изменяет список на месте и возвращает None. Затем вы назначаете значение None и переписываете список.

Просто сделай collectorf.append(str(host)) вместо:

if response.status == 200: 
    filename = "found.txt" 
    data = collectorf 
else: 
    filename = "notfound.txt" 
    data = collectornf 
data.append(str(host)) 
with open('C:/Users/Andi/Desktop/' + filename,'w') as found: 
    found.writelines(data) 

(Refactored, чтобы избежать копирования кодирования/вставить и использовать некоторые из советов, который я разместил в комментариях).

Обратите внимание, что для записи данных после цикла не будет много смысла, а не повторно.

+0

спасибо за ваш ответ, но есть одна вещь. В моей программе мне нужно найти найденные и не найденные админ-страницы. Таким образом, с кодом, который вы мне дали, моя программа предоставит список всех проверенных страниц admin, но пользователь не будет найден, а не –

+0

Мой код добавляет их в 'collectornf' или' collectorf' в зависимости от ответа 200 или нет, точно так же, как ваш код. Я не понимаю, в чем проблема? –

+0

Просто недоразумение на моей стороне! Еще раз спасибо за помощь. –

0

Я бы сохранил файлы открытыми. Постоянные открытия и закрытие кажутся для меня большими накладными расходами.

with open('C:/Users/Andi/Desktop/found.txt','w') as found, open('C:/Users/Andi/Desktop/notfound.txt','w') as notfound: # before 2.7, write this as 2 with statements 
    for adm in admpagelist: 
     adm = '/%s' % adm 
     host = value + adm 
     con = httplib.HTTPConnection(value) 
     con.connect() 
     request = con.request('GET', adm) 
     response = con.getresponse() 
     if response.status == 200: 
      targetlist = collectorf 
      targetfile = found 
     else: 
      targetlist = collectornf 
      targetfile = notfound 
     targetlist.append(str(host)) 
     targetfile.write(str(host) + '\n') 
     # if you are paranoid, you can as well do: 
     # targetfile.flush() 

with материал отвечает за потом снова закрыть файл.

Если вам не нужны списки после этого, вы можете их опустить, поскольку мы записываем файлы в каждый цикл.

+0

Да, надо попробовать! Спасибо. Кстати, так или иначе писать в этих файлах в новых символах. Я имею в виду: сайт.com/admin website.com/admin2 и т. Д. Причина в найденном и не найденном файле. Они не написаны в новой строке. Возможно, я должен сделать цикл for следующим образом: для i в целевом списке: i = '% s \ n'% i –

+0

@WidexND Забыл об этом и отредактировал мое решение: если вы хотите, чтобы он имел новые строки, просто введите их где бы вы ни захотели: после каждой записи в файлах: 'targetfile.write (str (host) + '\ n')' – glglgl

+0

спасибо за вашу помощь! Я никогда не слышал с заявлением раньше, поэтому я также узнал что-то новое –

Смежные вопросы