如何以CSV格式获取所有数据

时间:2018-11-05 11:39:09

标签: python python-3.x pandas csv

我无法完全掌握csv。得到...

数据:

                     0         ...                             5
0         Project Name         ...                 Other Details
1   SKV S ANANDA VILAS         ...            SKV S ANANDA VILAS
2         Project Name         ...                 Other Details
3   SKV S ANANDA VILAS         ...            SKV S ANANDA VILAS
4         Project Name         ...                 Other Details
5   SKV S ANANDA VILAS         ...            SKV S ANANDA VILAS
6         Project Name         ...                 Other Details
7   SKV S ANANDA VILAS         ...            SKV S ANANDA VILAS
8         Project Name         ...                 Other Details
9   SKV S ANANDA VILAS         ...            SKV S ANANDA VILAS
10        Project Name         ...                 Other Details
11  SKV S ANANDA VILAS         ...           SKV S ANANDAM VILAS

修改

import pandas as pd
import requests
import json, csv
from bs4 import BeautifulSoup
from tabulate import tabulate
from pandas.io.json import json_normalize

res = requests.get("http://rerait.telangana.gov.in/PrintPreview/PrintPreview/UHJvamVjdElEPTQmRGl2aXNpb249MSZVc2VySUQ9MjAyODcmUm9sZUlEPTEmQXBwSUQ9NSZBY3Rpb249U0VBUkNIJkNoYXJhY3RlckQ9MjImRXh0QXBwSUQ9")
soup = BeautifulSoup(res.content,'html.parser')

table_data = []

for i in range(len(soup.find_all('table'))):

    table = soup.find_all('table')[i] 
    df = pd.read_html(str(table))

    #print (df)
    with open('D:/out_table.csv', 'a') as outcsv:   
    #configure writer to write standard csv file
        writer = csv.writer(outcsv, delimiter=',', quotechar='|', quoting=csv.QUOTE_MINIMAL, lineterminator='\n')
        for item in df:
            for i in range(len(item)):
                print (item[0: i])
                writer.writerow(item[0: i])

通过使用上面的代码,可以写入csv文件,但是我得到了一些数据…………请提出如何以Web或propare格式相同地写入所有数据的建议。

或尝试过

for i in range(len(soup.find_all('table'))):

    table = soup.find_all('table')[i] 
    df = pd.read_html(str(table))
    table_data.append(df)

my_df = pd.DataFrame(table_data)
for i in range(len(my_df)):
    my_df.loc[[i]].to_csv('D:/my_csv.csv',
        index=True,
        header=True,
        mode='a')

如何以正确的格式获取所有数据?

1 个答案:

答案 0 :(得分:0)

如果创建并打印了Pandas数据框,Pandas将基于某些输出默认值显示该表的摘要,即为跳过的列显示...。不过,可以使用各种set_option()参数来更改这些默认值:

pd.set_option('display.max_rows', 500)
pd.set_option('display.max_columns', 500)
pd.set_option('display.width', 1500)

您的代码似乎正在尝试从该URL提取所有表并将它们全部写入单个CSV文件。 read_html()也可以使用URL,并将自动返回数据帧列表。这样避免了先使用requestsbeautifulsoup对其进行解析的需要。因此您的代码可能变成:

import pandas as pd

tables = pd.read_html("http://rerait.telangana.gov.in/PrintPreview/PrintPreview/UHJvamVjdElEPTQmRGl2aXNpb249MSZVc2VySUQ9MjAyODcmUm9sZUlEPTEmQXBwSUQ9NSZBY3Rpb249U0VBUkNIJkNoYXJhY3RlckQ9MjImRXh0QXBwSUQ9", header=0)

with open('out_table.csv', 'w') as outcsv:   
    for table in tables:
        if not table.empty:    # skip empty dataframes
            table.to_csv(outcsv, mode='a', index=False, sep='|')

如果需要进一步处理,则需要先使用Pandas调用将tables中的每个表重新格式化为所需格式,然后再将它们全部写入CSV格式。我建议通过表头识别每个表,然后应用适当的格式。例如,您可以删除不需要的列。您可能还想合并一些表。

通过表头标识每个表的原因是其他URL可能不包含同一组表。