簡體   English   中英

python將漂亮的湯數據解析為csv

[英]python parsing beautiful soup data to csv

我已經在python3中編寫了代碼來解析html / css表。 有一些問題:

  1. 我的csv輸出文件標頭不是由我的代碼基於html(標記:td,類:t1)生成的(在創建輸出文件時的第一次運行中)
  2. 如果傳入的html表具有一些其他字段(標記:td,類:t1),則我的代碼當前無法捕獲它們並在csv輸出文件中創建其他標題
  3. 在處理完我輸入文件中的所有ID(A001,A002,A003 ...)之前,數據不會寫入輸出cvs文件。 我想在輸入文件中每個ID的處理完成時(即在處理A002之前將A001寫入csv),將其寫入輸出cvs文件。
  4. 每當我重新運行代碼時,數據就不會從輸出csv中的下一行開始

作為菜鳥,我確信我的代碼非常基礎,並且會有更好的方法來做到這一點,並且希望學習更好地編寫並修復上面的問題。

需要建議和指導,請幫助。 謝謝。

我的代碼:

import csv
import requests
from bs4 import BeautifulSoup

## SIDs.csv contains ids in col2 based on which the 'url' variable pulls the respective data
SIDFile = open('SIDs.csv')
SIDReader = csv.reader(SIDFile)
SID = list(SIDReader)

SqID_data = []

#create and open output file
with open('output.csv','a', newline='') as csv_h:
    fields = \
    [
        "ID",
        "Financial Year",
        "Total Income",
        "Total Expenses",
        "Tax Expense",
        "Net Profit"
    ]

    for row in SID:
        col1,col2 = row
        SID ="%s" % (col2)

        url = requests.get("http://.......")
        soup = BeautifulSoup(url.text, "lxml")

        fy = soup.findAll('td',{'class':'tablehead'})
        titles = soup.findAll('td',{'class':'t1'})
        values = soup.findAll('td',{'class':'t0'})

        if titles:
            data = {}
            for title in titles:
                name = title.find("td", class_ = "t1")
            data["ID"] = SID
            data["Financial Year"] = fy[0].string.strip()
            data["Total Income"] = values[0].string.strip()
            data["Total Expenses"] = values[1].string.strip()
            data["Tax Expense"] = values[2].string.strip()
            data["Net Profit"] = values[3].string.strip()
            SqID_data.append(data)

    #Prepare CSV writer.
    writer = csv.DictWriter\
    (
        csv_h,
        fields,
        quoting        = csv.QUOTE_ALL,
        extrasaction   = "ignore",
        dialect        = "excel",
        lineterminator = "\n",
    )
    writer.writeheader()
    writer.writerows(SqID_data)
    print("write rows complete")

正在處理的HTML的摘錄:

<p>
<TABLE border=0 cellspacing=1 cellpadding=6 align=center class="vTable">
   <TR>
    <TD class=tablehead>Financial Year</TD>
    <TD class=t1>01-Apr-2015 To 31-Mar-2016</TD>
   </TR>
</TABLE>
</p>

<p>
<br>
<table cellpadding=3 cellspacing=1 class=vTable>
<TR>
    <TD class=t1><b>Total income from operations (net) ( a + b)</b></td>
    <TD class=t0 nowrap>675529.00</td>
</tr>
<TR>
    <TD class=t1><b>Total expenses</b></td>
    <TD class=t0 nowrap>446577.00</td>
</tr>
<TR>
    <TD class=t1>Tax expense</td>
    <TD class=t0 nowrap>71708.00</td>
</tr>
<TR>
    <TD class=t1><b>Net Profit / (Loss)</b></td>
    <TD class=t0 nowrap>157621</td>
</tr>
</table>
</p>

SIDs.csv(無標題行)

1,A0001
2,A0002
3,A0003

預期輸出:output.csv(創建標題行)

ID,Financial Year,Total Income,Total Expenses,Tax Expense,Net Profit,OtherFieldsAsAndWhenFound
A001,01-Apr-2015 To 31-Mar-2016,675529.00,446577.00,71708.00,157621.00
A002,....
A003,....

我建議您查看pandas.read_html來解析您的網絡數據; 在樣本數據上,這將為您提供:

import pandas as pd
tables=pd.read_html(s, index_col=0)
tables[0]
Out[11]: 
                                         1
0                                         
Financial Year  01-Apr-2015 To 31-Mar-2016

tables[1]
                                                  1
0                                                  
Total income from operations (net) ( a + b)  675529
Total expenses                               446577
Tax expense                                   71708
Net Profit / (Loss)                          157621

然后,您可以使用Pandas函數執行所需的數據操作(添加id的操作),然后使用DataFrame.to_csv導出。

暫無
暫無

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

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