Pandas+BeautifulSoup-如何将数据添加到循环下的新列但相同行中



我正在尝试抓取一个网站,在每个配置文件下都列出了不同数量的公司,有些配置文件是5,有些是0,有些是50+,等等。所有公司都在'div'标签下的'li'标签中。我可以很好地找到公司。但我无法将其放入所需的excel DataFrame中。

我想刮取公司的名称,并将所有公司的名称放在每个配置文件的同一行,每个公司都应该有自己的列,但要有同一行。以及每个配置文件的新行。如果我迭代";公司";通过for循环,它为公司中的每个公司名称创建新行和新列。

我可以通过单独定位每个"li"标签来做到这一点,但这不是一个优雅的解决方案,因为我不知道每个配置文件下有多少公司。感谢您通过短代码提供的任何帮助。感谢您的阅读!

我的代码:

company_list = []
for profile in profiles:
page = requests.get(profile, headers=headers)
soup = BeautifulSoup(page.text, 'html.parser')
companies = soup.find("div", class_="spec-list attributes-insurance").find_all("li")
for company in companies:
item = {f'company_{companies.index(company)}': company.text.strip()}
company_list.append(item)
pd.DataFrame(company_list).to_excel('company_list.xlsx')

我从这个代码中得到了什么:https://i.stack.imgur.com/C9q7J.png

我想要什么:https://i.stack.imgur.com/etgrH.png

尝试将公司列表存储到dict.

# save data to a dict
data_list = dict()
for tag, profile in enumerate(profiles):
# every profile store a company_list
company_list = []

########### same code ###########
page = requests.get(profile, headers=headers)
soup = BeautifulSoup(page.text, 'html.parser')
companies = soup.find("div", class_="spec-list attributes-insurance").find_all("li")
for company in companies:
item = {f'company_{companies.index(company)}': company.text.strip()}
company_list.append(item)
########### same code ###########
data_list[tag] = company_list   

输出样本:

data_list = {
0: ['1199SEIU', 'AMERIGROUP', 'Aetna', 'Anthem', 'Beacon'],
1: ['Aetna', 'Anthem', 'Beacon'],
2: ['Beacon', 'AMERIGROUP'], 
}
dfn = pd.Series(data_list).explode().to_frame().reset_index()
dfn.columns = ['idx', 'company']
dfn['tag'] = dfn['company']
# print(dfn)
df_output = dfn.set_index(['idx', 'company'])['tag'].unstack()
df_output.columns = [f'company_{i}' for (i, col) in  enumerate(df_output.columns)]
print(df_output)
company_0   company_1 company_2 company_3 company_4
idx                                                    
0    1199SEIU  AMERIGROUP     Aetna    Anthem    Beacon
1         NaN         NaN     Aetna    Anthem    Beacon
2         NaN  AMERIGROUP       NaN       NaN    Beacon

您可能只需要循环遍历每一列并删除其中的空行。

我使用了csv,但您可以将该行更改为read_excel

df_original = pd.read_csv("test.csv",index_col="index")
print(df_original)
df_new = pd.DataFrame()
for col in df_original.columns:
print(col)
df_tmp =  df_original[col].dropna().reset_index(drop=True)
print(df_tmp)
df_new[col] = df_tmp
print(df_new)

最新更新