如何在Python上使用bs4/selenium从解析的代码中创建数据帧?

如何在Python上使用bs4/selenium从解析的代码中创建数据帧?,python,pandas,selenium,dataframe,parsing,Python,Pandas,Selenium,Dataframe,Parsing,我已经解析了一个表,并希望将其中两个变量转换为一个数据框,以便打印到excel 供参考: 我确实问了一个类似的问题,但没有得到彻底的回答。没有关于如何创建熊猫数据帧的建议。这就是我问题的全部要点 警告: 我解析的数据有一个小问题。数据在输出中多次包含“团队”和“SA/G” 我希望数据框架中的第一个变量是“TEAM” 我想在数据帧中使用的第二个变量是'SA/G' 以下是我目前的代码: # imports from selenium import webdriver from bs4 i

我已经解析了一个表,并希望将其中两个变量转换为一个数据框,以便打印到excel

供参考: 我确实问了一个类似的问题,但没有得到彻底的回答。没有关于如何创建熊猫数据帧的建议。这就是我问题的全部要点

警告: 我解析的数据有一个小问题。数据在输出中多次包含“团队”和“SA/G”

我希望数据框架中的第一个变量是“TEAM”

我想在数据帧中使用的第二个变量是'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
...             ...
提前感谢您提供的任何帮助。我仍在学习,并感谢我能得到的任何反馈

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

import pandas as pd
data=[("t1","sag1"),("t2","sag2"),("t3","sag3")]
df = pd.DataFrame(data,columns=['Team','SA/G'])
print(df)
首先在“for循环”中,将元组附加到列表中(而不是执行data=[(x,y)],将循环前的数据变量声明为list
data=list()
,并将元组附加到循环中的list
数据中

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

看起来您想要从元组列表中创建一个数据帧,这已经得到了回答。 我会像这样更改您的代码:

# 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中的(“团队”、“SA/G”)行,看起来您想从元组列表中创建一个数据帧,这已得到回答。 我会像这样更改您的代码:

# 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中的(“团队”、“SA/G”)行!!输出看起来很棒!!我注意到输出多次包含“TEAM”和“SAG”。你知道如何从输出中删除这个吗?我非常感谢你的帮助。我将从中学到很多我想保留标题,而不是重复的“TEAM”和“SAG”,您可以使用df=df[df[“TEAM”!=“TEAM”]我试图添加这行代码@d_d,但额外的数据仍在输出中。有什么建议吗?@AbleArcher我编辑了上面的答案,加入了额外的一行-当我测试时,我得到了正确的结果。您是否在开始时添加了“df=”?您的代码就像您所说的@d_d一样完美地工作!我犯了一个错误,没有将“团队”资本化。你太棒了,谢谢你,先生!TY@d\d!!输出看起来很棒!!我注意到输出多次包含“TEAM”和“SAG”。你知道如何从输出中删除这个吗?我非常感谢你的帮助。我将从中学到很多我想保留标题,而不是重复的“TEAM”和“SAG”,您可以使用df=df[df[“TEAM”!=“TEAM”]我试图添加这行代码@d_d,但额外的数据仍在输出中。有什么建议吗?@AbleArcher我编辑了上面的答案,加入了额外的一行-当我测试时,我得到了正确的结果。您是否在开始时添加了“df=”?您的代码就像您所说的@d_d一样完美地工作!我犯了一个错误,没有将“团队”资本化。你太棒了,谢谢你,先生!原谅我。我不确定在哪里将此代码添加到我的代码中。谢谢你的回复。我确实试过了,但没有得到想要的结果。我肯定我做错了什么。原谅我。我不确定在哪里将此代码添加到我的代码中。谢谢你的回复。我确实试过了,但没有得到想要的结果。我肯定我做错了什么。