如何用BeautifulSoup从free-proxy-list.net分离提取IP与端口?
解决BeautifulSoup提取IP与端口分离的问题
嘿,我来帮你搞定这个问题!你现在只能拿到整行数据,是因为直接获取了<tr>的text属性,这会把该行所有<td>的内容拼接在一起。要拆分IP和端口,我们只需要定位到每行对应的<td>元素就行——目标网站的表格里,第一列是IP,第二列是端口,直接提取这两个<td>的文本就好。
方法一:遍历每行的<td>元素
修改你的循环部分,针对每个<tr>获取它下面的所有<td>,然后取前两个的文本:
def get_proxy(self): response = requests.get(self.url) soup = bs(response.content,'html.parser') data_list = [tr for tr in soup.select('tr') if tr.td] for tr in data_list: # 获取当前行的所有td标签 tds = tr.find_all('td') # 确保有足够的td元素,避免索引越界 if len(tds) >= 2: ip = tds[0].text.strip() # 第一个td是IP port = tds[1].text.strip() # 第二个td是端口 print(f"IP: {ip}, 端口: {port}")
方法二:用CSS选择器直接定位目标列
如果你想更简洁,可以直接用CSS选择器定位所有IP列和端口列的<td>,再配对遍历:
def get_proxy(self): response = requests.get(self.url) soup = bs(response.content,'html.parser') # 定位所有第一列的td(IP) ip_tds = soup.select('tr td:nth-of-type(1)') # 定位所有第二列的td(端口) port_tds = soup.select('tr td:nth-of-type(2)') # 配对IP和端口 for ip_td, port_td in zip(ip_tds, port_tds): ip = ip_td.text.strip() port = port_td.text.strip() print(f"IP: {ip}, 端口: {port}")
小提示
如果之后网站结构有变化,记得打开浏览器的开发者工具(F12)查看表格的HTML结构,确认IP和端口所在的<td>位置是否还是第1、第2列哦。
内容的提问来源于stack exchange,提问作者Ethan
相关产品推荐
相关产品推荐

