【问题标题】:extracting multiple data from table row in BS4从BS4中的表行中提取多个数据
【发布时间】:2020-08-01 18:06:09
【问题描述】:
在下面的代码中,我尝试使用BeautifulSoup 从表中提取http://free-proxy-list.net 的IP 地址和端口。
但是每次我得到整行都是无用的,因为我无法将 IP 地址与其端口分开。
如何将 IP 和端口分开?
这是我的代码:
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 i in data_list:
print(i.text)
【问题讨论】:
标签:
python
html
python-3.x
beautifulsoup
html-parsing
【解决方案1】:
在您的代码中,
而不是 -
i.text 你可以使用i.getText(' ,') (或者你选择的其他分隔符,而不是,)。
这将为您提供逗号分隔的 IP 和端口。
此外,为方便起见,您也可以将代理列表加载到数据框中。
对您的代码进行以下更改/添加 -
soup = bs(response.content,'html.parser')
data_list = [tr for tr in soup.select('tr') if tr.td]
data_list2 = [tr.getText(' ,') for tr in soup.select('tr') if tr.td]
#for i in data_list:
#print(i.text)
df = pd.DataFrame(data_list2,columns=['proxy_list'])
df_proxyList= df['proxy_list'].str.split(',', expand=True)[0:300]
df_proxyList 看起来像(垃圾列很少) -
【解决方案2】:
试试这个。我必须添加 isnumeric() 条件以确保代码不包含来自同一网站上的另一个表的数据。
from bs4 import BeautifulSoup as bs
import requests
from collections import defaultdict
def get_proxy(URL):
response = requests.get(url)
soup = bs(response.content,'html.parser')
mapping = defaultdict()
for tr in soup.select('tr'):
if len(list(tr)) == 8:
ip_val = str(list(tr)[0].text)
port_val = str(list(tr)[1].text)
if port_val.isnumeric():
mapping[ip_val] = port_val
for items in mapping.keys():
print("IP:",items)
print("PORT:",mapping[items])
if __name__ == '__main__':
url = "http://free-proxy-list.net"
get_proxy(url)