【问题标题】:Using BeautifulSoup to get_text of td tags within a resultset使用 BeautifulSoup 在结果集中获取 td 标签的文本
【发布时间】:2018-10-21 13:33:06
【问题描述】:

我正在从这个网站使用 BeautifulSoup 提取表格数据:https://afltables.com/afl/stats/teams/adelaide/2018_gbg.html

有许多具有唯一表 id 的表,我可以使用以下方法提取它们:

from bs4 import BeautifulSoup
from selenium import webdriver

stat_dict={'Disposals' : 'sortableTable0',
           'Kicks' : 'sortableTable1',
           'Marks' : 'sortableTable2',
           'Handballs' : 'sortableTable3',
           'Goals' : 'sortableTable4',
           'Behinds' : 'sortableTable5',
           'Hitouts' : 'sortableTable6',
           'Tackles' : 'sortableTable7',
           'Rebounds' : 'sortableTable8',
           'Inside50s' : 'sortableTable9',
           'Clearances': 'sortableTable10',
           'Clangers' : 'sortableTable11',
           'FreesFor' : 'sortableTable12',
           'FreesAgainst' : 'sortableTable13',
           'ContestedPosessions' : 'sortableTable14',
           'UncontestedPosesseions' : 'sortableTable15',
           'ContestedMarks' : 'sortableTable16',
           'MarksInside50' : 'sortableTable17',
           'OnePercenters' : 'sortableTable18',
           'Bounces' : 'sortableTable19',
           'GoalAssists' : 'sortableTable20',
           'Timeplayed' : 'sortableTable21'}

driver = webdriver.Firefox(executable_path='...')
url="https://afltables.com/afl/stats/teams/adelaide/2018_gbg.html"
driver.get(url)

html = driver.page_source
soup = BeautifulSoup(html, "lxml")

stat_wanted='Disposals'
table = soup.find_all('table', {'id':stat_dict[stat_wanted]})

从我提取的表格中,如果我使用soup.find('tbody'),我想做与下面的代码等效的代码。我知道这可能不是实现结果的最佳或最漂亮的方式,但我只是在玩弄代码以了解它是如何工作的。

def get_disposals(team_lower_case, nplayers, nrounds):
    list=[]
    page=requests.get("https://afltables.com/afl/stats/teams/" +str(team_lower_case) +"/2018_gbg.html")
    soup=BeautifulSoup(page.content, 'html.parser')
    filter=soup.find('tbody')

    for var in filter.find_all('tr'):
        columns=var.find_all('td')
        for val in columns:
            list.append(val.get_text())
    columns=['PlayerName']

    for n in range(1,nrounds+1):
        columns.append('R'+str(n))

    df=pd.DataFrame(np.array(list).reshape(nplayers,nrounds+1), columns=columns)
    return df

get_disposals("fremantle",30,8)

我已经尝试使用下面的代码从所有标签中获取文本,但结果并没有复制我在代码的第一个 sn-p 中提取特定表时能够实现的目标。

for tr in table:
    zxc=tr.find_all('td')
print(zxc)
for var in zxc:
    list=[]
    list.append(var.get_text())
print(list)

但这只会产生标签及其内容的列表,而不是您期望 get_text 按我希望的那样工作时所期望的内容。

【问题讨论】:

    标签: python beautifulsoup


    【解决方案1】:

    您可能会发现以下方法更容易一些:

    import pandas as pd    
    
    tables = pd.read_html("https://afltables.com/afl/stats/teams/adelaide/2018_gbg.html")
    
    for df in tables:
        df.drop(df.columns[9:], axis=1, inplace=True)   # remove unwanted columns
        df.columns = df.columns.droplevel(0)    # remove extra index level
    
    for table in tables:
        print(table[:3:], '\n')  # show first 3 rows
    

    这将为您提供 pandas 数据框的列表。每一个都包含每个表的所有信息。比如第一个包含Disposals

             Player    R1    R2    R3    R4    R5    R6    R7  Tot
    0  Atkins, Rory  14.0  17.0  22.0  28.0  24.0  28.0  16.0  149
    1  Betts, Eddie  14.0  20.0  16.0   6.0   NaN   NaN  10.0   66
    2   Brown, Luke  15.0  23.0  23.0  16.0  16.0  24.0  11.0  128 
    
             Player    R1    R2    R3    R4    R5    R6    R7  Tot
    0  Atkins, Rory   8.0  13.0  12.0  16.0  17.0  18.0  10.0   94
    1  Betts, Eddie   7.0   6.0  10.0   2.0   NaN   NaN   7.0   32
    2   Brown, Luke  10.0  17.0  17.0  10.0  11.0  16.0   9.0   90
    

    然后您可以使用 pandas 处理数据。

    【讨论】:

    • 太棒了 - 这是一种享受。我一直在尝试删除列标题“未命名:1_level_0”等...以及将索引重置为“处置”列,但不知道该怎么做?我已经能够通过以下方式调整标题: tables = pd.read_html("afltables.com/afl/stats/teams" +str(team_lower_case)+"/2018_gbg.html",header=1) 将标题设置为 Player、R1、R2 等...但不确定索引?
    • 您可以使用.droplevel(0) 删除不需要的索引级别。
    猜你喜欢
    • 2022-12-29
    • 1970-01-01
    • 2021-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-15
    • 1970-01-01
    相关资源
    最近更新 更多