【问题标题】:Writing tabular data to a csv file from a webpage从网页将表格数据写入 csv 文件
【发布时间】:2018-03-01 16:14:17
【问题描述】:

我在 python 中编写了一个脚本来解析网页中的一些数据并通过 panda 将其写入 csv 文件。到目前为止,我所写的内容可以解析该页面中可用的所有表,但如果写入 csv 文件,它会将该页面中的最后一个表写入该 csv 文件。当然,由于循环,数据正在被覆盖。如何修复这个缺陷,以便我的爬虫能够写入来自不同表的所有数据,而不仅仅是最后一个表?提前致谢。

import csv
import requests 
from bs4 import BeautifulSoup
import pandas as pd


res = requests.get('http://www.espn.com/nba/schedule/_/date/20171001').text
soup = BeautifulSoup(res,"lxml")
for table in soup.find_all("table"):
    df = pd.read_html(str(table))[0]
    df.to_csv("table_item.csv")
    print(df)

顺便说一句,我希望仅使用 panda 将数据写入 csv 文件。再次感谢。

【问题讨论】:

    标签: python python-3.x pandas csv web-scraping


    【解决方案1】:

    您可以在网页中使用read_html 什么返回list of DataFrames,因此需要concat 一个df

    dfs = pd.read_html('http://www.espn.com/nba/schedule/_/date/20171001')
    
    df = pd.concat(dfs, ignore_index=True)
    #if necessary rename columns
    d = {'Unnamed: 1':'a', 'Unnamed: 7':'b'}
    df = df.rename(columns=d)
    print (df.head())
                   matchup               a  time (ET)  nat tv  away tv  home tv  \
    0          Atlanta ATL       Miami MIA        NaN     NaN      NaN      NaN   
    1               LA LAC     Toronto TOR        NaN     NaN      NaN      NaN   
    2  Guangzhou Guangzhou  Washington WSH        NaN     NaN      NaN      NaN   
    3        Charlotte CHA      Boston BOS        NaN     NaN      NaN      NaN   
    4          Orlando ORL     Memphis MEM        NaN     NaN      NaN      NaN   
    
                               tickets   b  
    0  2,401 tickets available from $6 NaN  
    1   284 tickets available from $29 NaN  
    2  2,792 tickets available from $2 NaN  
    3  2,908 tickets available from $6 NaN  
    4  1,508 tickets available from $3 NaN  
    

    最后一个to_csv 用于写入文件:

    df.to_csv("table_item.csv", index=False)
    

    编辑:

    为了学习,可以将每个DataFrame 附加到列表中,然后将concat

    res = requests.get('http://www.espn.com/nba/schedule/_/date/20171001').text
    soup = BeautifulSoup(res,"lxml")
    dfs = []
    for table in soup.find_all("table"):
        df = pd.read_html(str(table))[0]
        dfs.append(df)
    
    df = pd.concat(dfs, ignore_index=True)
    print(df)
    
    df.to_csv("table_item.csv")
    

    【讨论】:

    • 感谢 jezrael 提供如此详尽的答案和清晰的说明。它服务于目的。但是,出于学习目的:如果我想坚持我在帖子中开始的方式,您能否建议我如何将这些数据写入 csv 文件。
    • 很高兴能帮上忙 ;) 祝你好运!
    猜你喜欢
    • 1970-01-01
    • 2020-03-03
    • 2015-04-28
    • 1970-01-01
    • 1970-01-01
    • 2015-06-03
    • 2019-09-18
    • 1970-01-01
    相关资源
    最近更新 更多