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