以下是我的代码&我试图从网站上抓代理。它正在抓代理人和将它们写入文本文件但在将最后一个代理写入文本文件后,它也会显示此错误。我在这做错了什么?
def new():
url = 'https://free-proxy-list.net'
page = requests.get(url)
# Turn the HTML into a Beautiful Soup object
soup = BeautifulSoup(page.text,'lxml')
with io.open('C:\\Users\\Desktop\\' + 'proxy.txt','a', encoding='utf8') as logfile:
for tr in soup.find_all('tr')[1:]:
tds = tr.find_all('td')
logfile.write(u"%s:%s\n"%(tds[0].text,tds[1].text))
print(u"\n%s:%s\n"%(tds[0].text,tds[1].text))
错误: -
追踪(最近一次通话): 文件" C:\ Users \ AppData \ Local \ Programs \ Python \ Python36 \ yt bot.py",第69行,in 新() 文件" C:\ Users \ AppData \ Local \ Programs \ Python \ Python36 \ yt bot.py",第64行,新增 logfile.write(U"%S:%S \ n"%(TDS [0]的.text,TDS [1]的.text)) IndexError:列表索引超出范围
答案 0 :(得分:1)
似乎最后<tr>
看起来像这样:
<tr>
<th class="input">
<input type="text" />
</th>
...
</tr>
这与其他条目无关,因此您可以安全地跳过它:
for tr in soup.find_all('tr')[1:-1]:
...
或者,使用try-except
块来捕获IndexError
也可以:
with io.open(...) as logfile:
for tr in soup.find_all('tr'):
try:
tds = tr.find_all('td')
logfile.write(u"%s:%s\n" % (tds[0].text, tds[1].text))
except IndexError:
pass
顺便说一句,我建议使用os.path.join
加入文件路径:
os.path.join('C:\\Users\\Desktop\\', 'proxy.txt')
这比使用+
的简单连接更安全。