TQC+ 網頁資料擷取與分析 Python 3 _ 202 美元收盤匯率

程式所產出的檔案,須輸出與程式同一層資料夾。

說明:
請撰寫一程式,爬取read.html,取得「新臺幣對美元銀行間成交之收盤匯率」資料,並將其中日期、NTD/USD兩個欄位的名稱與資料轉存為write.csv (需為UTF-8編碼格式)。
檔案連結:read.html (請另存檔案,必須與程式同一資料夾)
範例輸出:
Alt text

程式碼:
from bs4 import BeautifulSoup as BS
with open('read.html','r',encoding='UTF-8') as fp:
    data = fp.read()

soup = BS(data,'lxml')
li = soup.findAll('td')

with open('write.csv','w',encoding='UTF-8') as fp:
    fp.write('日期,NTD/USD')
    for i in range(2,len(li)-1,2):
        fp.write('\n{},{}'.format(li[i].text,li[i+1].text))
"""
import pandas as pd
import csv

data = pd.read_html('read.html',encoding='utf-8')

with open('write.csv', 'w', encoding='utf-8') as fp:
    csv.writer(fp).writerow( [data[1].columns[0], data[1].columns[1]] )
    for i in range(len(data[1])):
        csv.writer(fp).writerow( [data[1].iloc[i][0], '{:.3f}'.format(data[1].iloc[i][1])] )
"""

5 則留言:

  1. 抱歉打擾,我按照上述方法試跑,卻得到error 不知道是不是版本問題? 還有有其他因素?
    -----
    Traceback (most recent call last):
    File "C:\Users\User\anaconda3\envs\TQC_Day10\lib\site-packages\pandas\core\indexes\base.py", line 3080, in get_loc
    return self._engine.get_loc(casted_key)
    File "pandas\_libs\index.pyx", line 70, in pandas._libs.index.IndexEngine.get_loc
    File "pandas\_libs\index.pyx", line 101, in pandas._libs.index.IndexEngine.get_loc
    File "pandas\_libs\hashtable_class_helper.pxi", line 4554, in pandas._libs.hashtable.PyObjectHashTable.get_item
    File "pandas\_libs\hashtable_class_helper.pxi", line 4562, in pandas._libs.hashtable.PyObjectHashTable.get_item
    KeyError: 0

    The above exception was the direct cause of the following exception:

    Traceback (most recent call last):
    File "C:\Users\User\PycharmProjects\TQC_Day10\dataJsonTQC_202\PYA202.py", line 21, in
    csv.writer(fp).writerow(data[1][0][i], data[1][1][i])
    File "C:\Users\User\anaconda3\envs\TQC_Day10\lib\site-packages\pandas\core\frame.py", line 3024, in __getitem__
    indexer = self.columns.get_loc(key)
    File "C:\Users\User\anaconda3\envs\TQC_Day10\lib\site-packages\pandas\core\indexes\base.py", line 3082, in get_loc
    raise KeyError(key) from err
    KeyError: 0

    回覆刪除
    回覆
    1. 原本解法有錯,因為使用pandas,所以要使用iloc尋找資料,已修正。

      刪除
    2. 歐歐,感謝回覆! 剛剛試過確實成功了。我是菜雞一隻,自己想了老半天搞不出來還是得開口問XD

      刪除
  2. 您好~請問我剛試了一下 程式碼 還有重打一次
    產生的CSV裡面的資料都會多印一排 會變成下面這樣 請問是哪裡有問題嗎
    日 期,NTD/USD

    2018-06-26,30.412

    2018-06-25,30.403

    2018-06-22,30.307

    2018-06-21,30.302

    2018-06-20,30.170

    2018-06-19,30.186

    回覆刪除
    回覆
    1. 第二類應該還沒用到pandas,所以把程式碼改成使用BS來處理,再用with open來寫成csv,這樣應該比較符合第二類的範圍

      刪除