2016-07-22 5 views
1

Я создаю скрипт, но есть некоторые проблемы с его частью, поэтому я вставляю только эту часть вместо всего скрипта .. в любом случае эта только часть работает также в одиночестве. Вот оно:Weird error - иногда это показывает, а иногда и не

import re, random, os.path, urllib.request 
from bs4 import BeautifulSoup 

def proxyget(): 
    if os.path.isfile("proxy.txt"): 
     out_file = open("proxy.txt","w") 
     out_file.write("") 
     out_file.close() 
    else: 
     pass 
    url = "https://www.inforge.net/xi/forums/liste-proxy.1118/" 
    soup = BeautifulSoup(urllib.request.urlopen(url), "lxml") 
    base = "https://www.inforge.net/xi/" 
    for tag in soup.find_all("a", {"class":"PreviewTooltip"}): 
     links = tag.get("href") 
     final = base + links 
     result = urllib.request.urlopen(final) 
     for line in result : 
      ip = re.findall("(?:[\d]{1,3})\.(?:[\d]{1,3})\.(?:[\d]{1,3})\.(?:[\d]{1,3}):(?:[\d]{1,5})", str(line)) 
      if ip: 
       print("Proxy grabbed=> "+'\n'.join(ip)) 
       for x in ip: 
        out_file = open("proxy.txt","a") 
        while True: 
         out_file.write(x+"\n") 
         out_file.close() 
         break 

def withproxy(): 
    try: 
     out_file = str(input("Enter the proxy list: ")) 
     with open(out_file) as x: 
      proxylist = list(x) 
      for y in proxylist: 
       proxylist = y.split('\n') 
       proxy = random.choice(proxylist).split(':') 
    except: 
     print ("Error to read file, try again") 
     withproxy() 
    host = proxy[0] 
    port = int(proxy[1]) 

proxyget() 
withproxy() 

Я не понимаю, почему иногда эта часть кода работает, а иногда показывается эта ошибка:

Proxy grabbed=> x.x.x.x:x 
Enter the proxy list: proxy.txt 
Traceback (most recent call last): 
    File "proxytry.py", line 44, in <module> 
    withproxy() 
    File "proxytry.py", line 41, in withproxy 
    port = int(proxy[1]) 
IndexError: list index out of range 

Что плохого в этом? Не могли бы вы помочь мне?

ответ

2

Ошибка сама по себе прямая; а proxy в конце withproxy поддерживает индексы, у него нет индекса 1. Это может быть список одной записи или одного символа, что-то вдоль этих строк.

Быстрый взгляд на тело над этой точкой показывает, что proxy может вообще не устанавливаться в withproxy; это происходит только в том случае, если ему удастся прочитать файл (почему он назван out_file, когда он является чисто введенным, неясно), прочитайте его как строки (итерация по файлу делает это по умолчанию, как это сделано с помощью list в этом случае), разделите их на '\n' (даже если они уже являются линиями), затем выберите случайный выбор этих гипотетических строк в строках (они не будут встречаться, но каждая строка, за исключением, возможно, последней, будет выбрана пустая строка), а затем разделите ее на толстой кишке.

Я думаю, что вы имели в виду больше вдоль линий:

entries = open(filename).readlines() 
proxy = random.choice(entries).strip().split(':') 

Это будет выбрать случайную строку, а не случайным образом выбирать между пустой строкой и каждой строки для каждой строки. Вторая проблема заключается в том, что рекурсивный вызов в вашем блоке except не устанавливает proxy.

+0

спасибо большое, вот что я искал! – Sperly1987

4
proxylist = y.split('\n') 

создает пустую строку '' в конце списка, например, что proxylist = [..., ''].

Так что, когда random.choice выбирает один из пунктов в списке, в какой-то момент он выбирает '', для которых split на ':' возвращает список с одним пунктом [''].

proxy[1] поэтому повышение a IndexError.


Я также не понимаю, почему имя proxylist используется в цикле, пока вы итерацию в списке со ссылкой proxylist:

for y in proxylist: 
    proxylist = y.split('\n') # avoid ambuguity, use another name 

Я, к сожалению, не могу создайте рабочую версию для своего кода, так как я точно не знаю содержимое файла, который вы читаете. Думаю, лучше не догадываться.

+1

'proxylist' не изменяется, он затенен (итерация работает только с оригиналом). Все еще запутано. –

+1

Я исправил это, однако имя не должно использоваться –

+1

Мы согласны с этим. Но тогда только последние три переменные в функции имеют разумные имена, и ни один из них не экспортируется из сферы действия. –

1

Я сомневаюсь, что это полностью ответит на вопрос, но «индекс списка вне диапазона» обычно означает, что вы попросили элемент, который не существует, помните, что номера элементов списка начинаются с 0, поэтому в строке 41: «порт = int (прокси [1]) "," прокси [1] ", вероятно, не существует, то есть список" прокси "либо пуст, либо содержит один элемент. Если вы хотите использовать первый элемент, используйте «proxy [0]».

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