字串處理
每個程式都是在處理資料,就拿上一章的猜數字遊戲來說,程式處理的資料就是從使用者輸入的數值與亂數產生器所產生的數值做比較,而這章節主要著重於字串這個資料型態的說明。
- 字串就是一連串的字元。
- 字串的第一個字為起始位置(Start),從 0 開始。
- 字串其他位置的字元與起始字元的距離則稱為偏移值(Offset)或是索引(Index)。
- 舉個例子來說,text = "ABC" 這個字串,A 就是字串的開始,其偏移值為 0(Index = 0); B 則是偏移值 1(Index = 1);C 則是偏移值 2 ( Index = 2)。
提醒
這本書出版年份較早(事實上現在已經絕版),因此如果試著輸入書中所寫的網站位置("http://beans-r-us.appspot.com/prices.html")會發現網頁已不存在。因此接下來的內容我會將原本要從 URL 取得咖啡豆價格的 html 字串修改為從本地端創造一個 html 檔案(內容我儘量與書中一致),並使用 Python 匯入程式來模擬書中範例。
開啟文字編輯器然後輸入以下 html 內容後另存為.html 檔案。
<html><head><title>Welcome to the Beans'R'Us Pricing Page</title>
<link rel="stylesheet" type = "text/css" href = "beansrus.css"/>
</head><body>
<h2>Welcome to the Beans 'R'Us Pricing Page</h2>
<p>Current price of coffee beans = <strong>$5.49</strong></p>
<p>Price valid for 15 minutes from 19:42 on Wednesday 27/05/2009.</p>
</body>
</html>
使用瀏覽器開啟這個 html 檔案就會看到以下網站內容:

現在一切就緒可以開始撰寫程式碼。
先從購買咖啡豆的程式開始
- 功能需求:請撰寫一個程式可以在指定 html 檔案上擷取出目前咖啡豆的價格。
- 請在程式最前面先加入以下程式碼。
程式碼:
fileName = "/Coffee.html"
file = open(fileName,'r')
text = file.read()
print(text)
其中 Coffee.html 檔案請放在指定的資料夾位置。
這時候如果執行程式碼就會截取內容如下:

- text 是一個很大的字串,我們要做的就是在這個字串中取得 5.49 這個子字串。
- 在 Python 中利用索引值來取得子字串 Text [Index1: Index2 ],意思是從 Index1 開始擷取子字串到 Index2,但不包含 Index2 這個字元。
程式碼:
fileName = "/Coffee.html"
file = open(fileName,'r')
text = file.read()
price = text[238:242]
print(price)
價格資訊是動態的
- 功能需求變更:如果網頁內容是動態的,那程式該如何修正才會一樣取得價格資訊呢?例如因為過新年,所以網頁多了"Happy New Year!" 如下圖:

- 觀察一下 html 內容發現,價格資訊總是在 >$ 之後,因此得先搜尋 >$ 字串的位置後,再往後取得價格資料。
程式碼:
fileName = "/Coffee.html"
file = open(fileName,'r')
text = file.read()
where = text.find('>$')
start_of_price = where + 2
end_of_price = start_of_price + 4
price = text[start_of_price:end_of_price]
print(price)
在指定價格時買入
- 功能需求變更:使用者希望取得好價錢的時候(價格低於某個值)才買入,否則就不購買
- 程式需要一直取得價格資訊,並且判斷是否低於某個價格,回想一下這個功能在上一章的猜數字遊戲中實作過,必須使用 While 迴圈。
- 請注意:因為我們是用本地端 html 來模擬網站資訊,因此如果在 html 中的價格大於 6.9,就會造成程式無法跳離迴圈導致程式掛掉。
程式碼:
price = 9999.0
while(price > 6.9):
fileName = "/Coffee.html"
file = open(fileName,'r')
text = file.read()
where = text.find('>$')
start_of_price = where + 2
end_of_price = start_of_price + 4
price = float(text[start_of_price:end_of_price])
print('Buy!')
定時詢問價格
- 功能需求變更:剛剛的程式可以正確執行,但是如果使用者不需要一直詢問價格,而是每個 15 分鐘才詢問一下價格呢?
- 可以使用 Python 內建的 time 函式庫。
- time.sleep(900) 表示暫停 900s (也就是15分鐘)後再執行。
程式碼:
import time
price = 9999.0
while(price > 6.9):
time.sleep(900)
fileName = "/Coffee.html"
file = open(fileName,'r')
text = file.read()
where = text.find('>$')
start_of_price = where + 2
end_of_price = start_of_price + 4
price = float(text[start_of_price:end_of_price])
print(price)
print('Buy!')