使用 BeautifulSoup 从网页中抓取代理 IP

Scraping proxy IPs from a webpage using BeautifulSoup

下面是我的代码,我正在尝试从网站上抓取代理。它正在抓取代理并将它们写入文本文件,但在将最后一个代理写入文本文件后,它也显示此错误。我在这里做错了什么?

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 行,位于 新的() 文件 "C:\Users\AppData\Local\Programs\Python\Python36\yt bot.py",第 64 行,在新的 logfile.write(u"%s:%s\n"%(tds[0].text,tds[1].text)) IndexError: 列表索引超出范围

最后的<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')

这比使用 + 的简单串联更安全。