iT邦幫忙

DAY 21
4

用python擷取網頁上的開放資訊(數據資料),分析及畫出圖表系列 第 19

python抓網頁data,及做圖表之二十三:當網頁的解析庫(Beautiful Soup)有bug時

  • 分享至 

  • twitterImage
  •  

[quote=巴菲特]假如觀念會過時,那就不足以成為觀念。[/quote]

開源的自由軟體,一開始就沒界定,自由就是免費,
自由和免費在中文本來就不是同一個字,只有英文,碰巧是同一個單字(FREE)。
我還是感謝自由軟體帶來的眾多免費軟體,它促進了社會的公平,
尤其是很多人窮得沒有電腦用,沒錢付上網費。這些免費又開源的軟體真好。

不知道,為何在本社群裏流傳著,**免費往往是最貴的,免費的東西你敢用嗎?**這類的城市傳說,
以股市為例,公開資訊上的data, 基本上也是納稅人的錢做出的網站,大家都可以取得,
即使沒納稅的人也可以取用。接近於免費,這是爛的東西嗎?
就算不看基本面,純粹以消息面/分析面來看data, 仍是有很多可看性看的資料。

收費的軟體,鎖這鎖那的,想改都沒得改,付維費合約,還是給你拖拖拉拉,或是修改後的BUG造成你更大的痛。這就是好的。

看到微軟的WIN8可能賣得比VISTA差,這也算是史上奇蹟,當一家公司壟斷,從市場佔有率昇華到思想文化上的壟斷,那公司可以經常出現錯誤的決策,可以背離使用者需求,仍然維持公司正常營運。
因為[url=http://www.crummy.com/software/BeautifulSoup/]Beautiful Soup[/url]
的API設計的太直白,所以我沒有複習正則表達式,或使用標準庫來解析網頁的資料。

終於,它有了bug, 其實己經第三次出現了。之前會忽略,因為還在思考分析的指標,
描述一下bug, 這樣可以回報給官網。

import urllib.request
from bs4 import BeautifulSoup
url = 'http://www.twse.com.tw/ch/trading/exchange/BWIBBU/BWIBBU_d.php?'\
        'input_date=102%2F10%2F09&select2=ALL&order=STKNO&login_btn=%ACd%B8%DF'
response = urllib.request.urlopen(url)
html = response.read()
sp = BeautifulSoup(html.decode('cp950','ignore'))    
print(sp)


<title>TWSE 臺灣證券交易所  ﹥交易資訊 ﹥盤後資訊 ﹥個股日本益比、殖利率及股價淨值比(依日期查詢)</title><meta content="text/html; charset=utf-8" http-equiv="Content-Type"/><meta content="IE=EmulateIE7" http-equiv="X-UA-Compatible"/><link href="/ch/css/style.css" rel="stylesheet" type="text/css"/><link href="/ch/css/table.css" rel="stylesheet" type="text/css"/><style type="text/css"></style>

筆者本來以為是decode的關係。

拿掉decode

url = 'http://www.twse.com.tw/ch/trading/exchange/BWIBBU/BWIBBU.php?myear=2013&mmon=10&STK_NO=3149&login_btn=%ACd%B8%DF'
response = urllib.request.urlopen(url)
html = response.read()

sp = BeautifulSoup(html)
print(sp)

<title>TWSE 臺灣證券交易所  ﹥交易資訊 ﹥盤後資訊 ﹥個股日本益比、殖利率及股價淨值比(依代碼查詢)</title><meta content="text/html; charset=utf-8" http-equiv="Content-Type"/><meta content="IE=EmulateIE7" http-equiv="X-UA-Compatible"/><link href="/ch/css/style.css" rel="stylesheet" type="text/css"/><link href="/ch/css/table.css" rel="stylesheet" type="text/css"/><style type="text/css"></style>

經過BeautifulSoup,結果一樣。

筆者想想,有沒有可能是urllib.request.urlopen抓網頁,就沒抓完全,
雖然看到抓回來的有****覺得機會不大,
還是求証一下。

url = 'http://www.twse.com.tw/ch/trading/exchange/BWIBBU/BWIBBU.php?myear=2013&mmon=10&STK_NO=3149&login_btn=%ACd%B8%DF'
response = urllib.request.urlopen(url)
html = response.read()
print(html)
-------------------------
align=center class=til_2>102 \xa6~10\xa4\xeb \xa5\xbf\xb9F  \xad\xd3\xaa\xd1\xa4\xe9\xa5\xbb\xafq\xa4\xf1\xa1B\xb4\xde\xa7Q\xb2v\xa4\xce\xaa\xd1\xbb\xf9\xb2b\xad\xc8\xa4\xf1\xa1]\xa8\xcc\xa5N\xbdX\xacd\xb8\xdf\xa1^&lt;/div>&lt;/td>&lt;/tr>&lt;tr bgcolor=#EBDCC9>&lt;td height=20 class=basic2 align=center>\xa4\xe9\xb4\xc1&lt;/td>&lt;td height=20 class=basic2 align=center>\xa5\xbb\xafq\xa4\xf1&lt;/td>&lt;td height=20 class=basic2 align=center>\xb4\xde\xa7Q\xb2v(%)&lt;/td>&lt;td height=20 class=basic2 align=center>\xaa\xd1\xbb\xf9\xb2b\xad\xc8\xa4\xf1&lt;/td>&lt;/tr>&lt;tr bgcolor=#FFFFFF>&lt;td height=20 class=basic2 align=center> 102/10/01&lt;/td>&lt;td height=20 class=basic2 align=right> \xa1\xd0&lt;/td>&lt;td height=20 class=basic2 align=right> 1.71&lt;/td><td height=20 class=basic2 align=right> 1.59</td></tr><tr bgcolor=#FFFFFF><td height=20 class=basic2 align=center> 102/10/02</td><td height=20 class=basic2 align=right> \xa1\xd0</td><td height=20 class=basic2 align=right> 1.72</td><td height=20 class=basic2 align=right> 1.58</td></tr><tr 

----------------------------------

還是原汁原味的網頁檔,要抓的data有在裏面。
原來我們的browser還是挺利害的,解析的函式庫,直接整個跳掉的內容,
browser還是能呈現出來。

讓Beautiful Soup整個跳掉的關鍵,值得讓人深思的問題,那些網頁的寫法,
會讓Beautiful Soup解不出來。筆者今年恐怕沒法回答,得要明年鐵人賽。
這個議題,是讓筆者學習除錯的好議題。最近想先把一些想法先落實成程式,這個議題只好延後了。

筆者先試一下標準庫或是Beautiful Soup引用的非常老牌且資深的庫:[url=http://lxml.de/]lxml[/url]


上一篇
python抓網頁data,及做圖表之二十二:股價與獲利能力比較
下一篇
Scrapy(一):python語言在爬網界的標準
系列文
用python擷取網頁上的開放資訊(數據資料),分析及畫出圖表22
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言