簡體   English   中英

從bs4制作pandas DataFrame時如何跳過列?

[英]How to skip columns when making a pandas DataFrame from bs4?

我正在嘗試使用 Python 和 BeautifulSoup4 從網站上刮一張桌子。 然后我想輸出表格,但我想跳過表格的前 5 列。 這是我的代碼

def scrape_data():
    url1 = "https://basketball-reference.com/leagues/NBA_2020_advanced.html"
    html1 = urlopen(url1)
    soup1 = bs(html1, 'html.parser')
    soup1.findAll('tr', limit = 2)
    headers1 = [th.getText() for th in soup1.findAll('tr', limit = 2)[0].findAll('th')]
    headers1 = headers1[5:]
    rows1 = soup1.findAll('tr')[1:]
    player_stats = [[td.getText() for td in rows1[i].findAll('td')]for i in range(len(rows1))]
    stats1 = pd.DataFrame(player_stats, columns=headers1)
    return stats1

我得到的錯誤是ValueError: 24 columns passed, passed data had 28 columns

我知道錯誤來自stats1 = pd.DataFrame(player_stats, columns=headers1)

但是我該如何解決呢?

只需在結果數據幀上使用iloc 請注意, read_html返回一個數據幀列表,盡管每個 url 只有一個。 您需要通過pd.read_html(url)[0]訪問此單個數據pd.read_html(url)[0] 然后只需使用iloc忽略前五列。

url = "https://basketball-reference.com/leagues/NBA_2020_advanced.html"
df = pd.read_html(url)[0].iloc[:, 5:]

感謝@JonClements 的幫助,我解決了這個問題。 我的工作代碼是

def scrape_data():
    url1 = "https://basketball-reference.com/leagues/NBA_2020_advanced.html"
    html1 = urlopen(url1)
    soup1 = bs(html1, 'html.parser')
    soup1.findAll('tr', limit = 2)
    headers1 = [th.getText() for th in soup1.findAll('tr', limit = 2)[0].findAll('th')]
    headers1 = headers1[5:]
    rows1 = soup1.findAll('tr')[1:]
    player_stats = [[td.getText() for td in rows1[i].findAll('td')[4:]]for i in range(len(rows1))]
    stats1 = pd.DataFrame(player_stats, columns=headers1)
    return stats1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM