BeautifulSoup 和 pd.read_html - 如何将链接保存到最终数据框中的单独列中?
BeautifulSoup and pd.read_html - how to save the links into separate column in the final dataframe?
我的问题与这个有点相似:
我有一组 link,其中包含 table(每个 4 table,我只需要其中的前三个)。目标是将每个 table 的 link 存储在单独的 'address' 列中。
links = ['www.link1.com', 'www.link2.com', ... , 'www.linkx.com']
details = []
for link in tqdm(links):
page = requests.get(link)
sauce = BeautifulSoup(page.content, 'lxml')
table = sauce.find_all('table')
# Only first 3 tables include data
for i in range(3):
details.append(pd.read_html(str(table))[i])
final_df = pd.concat(details, ignore_index=True)
final_df['address'] = link
time.sleep(2)
但是,当我使用此代码时,只有最后一个 link 被分配给 'address' 列中的每一行。
我可能遗漏了一个细节,但花了最后 2 个小时来解决这个问题,但根本无法取得任何进展 - 非常感谢您的帮助。
您已接近目标 - 在每次迭代中将 df['address']
添加到您的 DataFrame
,然后再将其添加到您的列表:
for i in table[:3]:
df = pd.read_html(str(i))[0]
df['address'] = link
details.append(df)
注意 您还可以对 ResultSet
个表 table[:3]
进行切片,这样您就不必使用 range
将连接移出循环并在迭代结束时调用它:
final_df = pd.concat(details, ignore_index=True)
例子
import pandas as pd
links = ['www.link1.com', 'www.link2.com','www.linkx.com']
details = []
for link in links:
# page = requests.get(link)
# sauce = BeautifulSoup(page.content, 'lxml')
# table = sauce.find_all('table')
table = ['<table><tr><td>table 1</td></tr></table>',
'<table><tr><td>table 2</td></tr></table>',
'<table><tr><td>table 3</td></tr></table>']
# Only first 3 tables include data
for i in table[:3]:
df = pd.read_html(str(i))[0]
df['address'] = link
details.append(df)
final_df = pd.concat(details, ignore_index=True)
输出
0
address
table 1
www.link1.com
table 2
www.link1.com
table 3
www.link1.com
table 1
www.link2.com
table 2
www.link2.com
table 3
www.link2.com
table 1
www.linkx.com
table 2
www.linkx.com
table 3
www.linkx.com
我的问题与这个有点相似:
我有一组 link,其中包含 table(每个 4 table,我只需要其中的前三个)。目标是将每个 table 的 link 存储在单独的 'address' 列中。
links = ['www.link1.com', 'www.link2.com', ... , 'www.linkx.com']
details = []
for link in tqdm(links):
page = requests.get(link)
sauce = BeautifulSoup(page.content, 'lxml')
table = sauce.find_all('table')
# Only first 3 tables include data
for i in range(3):
details.append(pd.read_html(str(table))[i])
final_df = pd.concat(details, ignore_index=True)
final_df['address'] = link
time.sleep(2)
但是,当我使用此代码时,只有最后一个 link 被分配给 'address' 列中的每一行。
我可能遗漏了一个细节,但花了最后 2 个小时来解决这个问题,但根本无法取得任何进展 - 非常感谢您的帮助。
您已接近目标 - 在每次迭代中将 df['address']
添加到您的 DataFrame
,然后再将其添加到您的列表:
for i in table[:3]:
df = pd.read_html(str(i))[0]
df['address'] = link
details.append(df)
注意 您还可以对 ResultSet
个表 table[:3]
进行切片,这样您就不必使用 range
将连接移出循环并在迭代结束时调用它:
final_df = pd.concat(details, ignore_index=True)
例子
import pandas as pd
links = ['www.link1.com', 'www.link2.com','www.linkx.com']
details = []
for link in links:
# page = requests.get(link)
# sauce = BeautifulSoup(page.content, 'lxml')
# table = sauce.find_all('table')
table = ['<table><tr><td>table 1</td></tr></table>',
'<table><tr><td>table 2</td></tr></table>',
'<table><tr><td>table 3</td></tr></table>']
# Only first 3 tables include data
for i in table[:3]:
df = pd.read_html(str(i))[0]
df['address'] = link
details.append(df)
final_df = pd.concat(details, ignore_index=True)
输出
0 | address |
---|---|
table 1 | www.link1.com |
table 2 | www.link1.com |
table 3 | www.link1.com |
table 1 | www.link2.com |
table 2 | www.link2.com |
table 3 | www.link2.com |
table 1 | www.linkx.com |
table 2 | www.linkx.com |
table 3 | www.linkx.com |