使用BeautifulSoup从网页中搜索代理IP

时间:2017-08-27 06:15:45

标签: python web-scraping beautifulsoup bs4

以下是我的代码&我试图从网站上抓代理。它正在抓代理人和将它们写入文本文件但在将最后一个代理写入文本文件后,它也会显示此错误。我在这做错了什么?

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:列表索引超出范围

1 个答案:

答案 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')

这比使用+的简单连接更安全。