【问题标题】:How to Create Pandas DataFrame out of Parsed Code using bs4/selenium on Python?如何在 Python 上使用 bs4/selenium 从已解析代码中创建 Pandas DataFrame?
【发布时间】:2020-02-25 08:14:27
【问题描述】:

我已经解析了一个表格,并希望将其中两个变量转换为 Pandas Dataframe 以打印到 Excel。

仅供参考: 我确实问过类似的问题,但是没有得到彻底的回答。没有关于如何创建 Pandas DataFrame 的建议。这就是我问题的重点。

注意: 我解析的数据存在小问题。数据在输出中多次包含“TEAM”和“SA/G”。

我希望 DataFrame 中的第一个变量是“TEAM”。

我想要在 DataFrame 中的第二个变量是“SA/G”。

到目前为止,这是我的代码:

# imports
from selenium import webdriver      
from bs4 import BeautifulSoup

# make a webdriver object
driver = webdriver.Chrome('C:\webdrivers\chromedriver.exe')

# open some page using get method       - url -- > parameters
driver.get('http://www.espn.com/nhl/statistics/team/_/stat/scoring/sort/avgGoals')

# driver.page_source
soup = BeautifulSoup(driver.page_source,'lxml')
#close driver
driver.close()
#find table
table = soup.find('table')
#find_all table rows
t_rows = table.find_all('tr')
#loop through tr to find_all td
for tr in t_rows:
    td = tr.find_all('td')
    row = [i.text for i in td]
    # print(row)
    # print(row[9])
    # print(row[1], row[9])

    team = row[1]
    sag = row[9]

    # print(team, sag)
    data = [(team, sag)]
    print(data)

这是我希望使用 Pandas DataFrame 选项打印到 excel 的最终输出:

Team           SA/G
Nashville      30.1
Colorado       33.6
Washington     31.0
...             ...

提前感谢您提供的任何帮助。我仍在学习并感谢我能得到的任何反馈。

【问题讨论】:

    标签: python pandas selenium dataframe parsing


    【解决方案1】:

    首先在“for循环”中将元组附加到列表中(而不是执行 data=[(x,y)] 将循环之前的数据变量声明为列表data = list() 并将元组附加到循环中的列表中data.append((x,y))) 并执行以下操作

    import pandas as pd
    data=[("t1","sag1"),("t2","sag2"),("t3","sag3")]
    df = pd.DataFrame(data,columns=['Team','SA/G'])
    print(df)
    

    【讨论】:

    • 原谅我。我不确定在哪里将此代码添加到我的代码中。非常感谢您的回复。我确实尝试过,但没有得到想要的输出。我确定我做错了什么。
    【解决方案2】:

    看起来您想从元组列表中创建一个 DataFrame,已回答 here。 我会像这样更改您的代码:

    # Initial empty list
    data = []
    #loop through tr to find_all td
    for tr in t_rows:
        td = tr.find_all('td')
        row = [i.text for i in td]
        team = row[1]
        sag = row[9]
        # Add tuple containing one row of data
        data.append((team, sag))
    # Create df from list of tuples
    df = pd.DataFrame(data, columns=['Team', 'SA/G'])
    # Remove lines where Team value is "TEAM"
    df = df[df["Team"] != "TEAM"]
    

    编辑:添加行以删除 df 中的 ("TEAM", "SA/G") 行

    【讨论】:

    • TY @d_d!!输出看起来很棒!我确实注意到输出多次包含“TEAM”和“SAG”。您是否偶然知道如何从输出中删除它?我非常感谢你的帮助。我会从中学到很多东西。 =) 我想保留标题,而不是重复的“TEAM”和“SAG”
    • 你可以使用 df = df[df["Team"] != "TEAM"]
    • 我尝试添加这行代码@d_d,但额外的数据仍在输出中。有什么建议吗?
    • @AbleArcher 我编辑了上面的答案以包含额外的行 - 当我测试时,我得到了正确的结果。你是在开头添加“df =”吗?
    • 你的代码就像你说的一样完美运行@d_d!我犯了没有大写“TEAM”的错误。太棒了,谢谢楼主!
    猜你喜欢
    • 2014-12-16
    • 2020-02-24
    • 1970-01-01
    • 1970-01-01
    • 2018-12-03
    • 2015-10-29
    • 2020-12-08
    • 2017-12-09
    • 1970-01-01
    相关资源
    最近更新 更多