2011年11月15日 星期二

python3資料庫解決方案

P.S.此文件會持續不斷更新


SQLite

Python3裡就有內建SQLite的讀寫模組

MySQL

很遺憾,Python3對MySQL似乎沒有比較有完整的原生套件,目前最接近目標的是oursql
2012.12.29
目前MySQL官方自己主動推出套件,強調全部都使用python撰寫,安裝不須使用C的編譯器,而且依照python DB API規範,所以會用sqlite的人應該會用得很開心,詳細介紹如下
[http://nopython.blogspot.tw/2012/12/mysqlpythonmysql-python33.html]

[oursql 0.92]
下載位置--->https://launchpad.net/oursql/py3k/
說明文件--->http://packages.python.org/oursql/

但目前這份套件卻還沒幫Python3.2做獨立安裝套件,,只有3.1的,所以要自行安裝。但由於裡面用到Cython,所以還要弄C的編譯器,要設定MySQL路徑...安裝步驟繁瑣,看到就軟掉了...

[MySQL-python-1.2.3]
下載位置--->http://www.lfd.uci.edu/~gohlke/pythonlibs/#mysql-python
說明文件--->http://mysql-python.sourceforge.net/MySQLdb-1.2.2/

這個套件是python2時代最受歡迎的MySQL套件,發展超過五年,也相當的穩定,網路上文件爆多,然而最大的缺點是它開發的步伐相當緩慢(從1.2.2到1.2.3就花了三年...),因此期待它變出python3的版本可望而不可及。所幸網路上總是有熱心人士,不只改寫成Python3的版本,還幫你包成獨立安裝檔,真的是佛心來的。不過相對的,由於是非官方作品,可能會有些網路現有資料所沒有紀錄的錯誤,故要小心使用。我自己用目前簡單的試用是沒甚麼問題。

Firebird

據說這個是三大免費資料庫中(PostgreSQL、MySQL、Firebird )中速度最快、彈性最好的資料庫,且同時支援如MySQL的伺服器式或是sqlite的嵌入式應用。然而文件卻少得可憐,連官網說明文件說是亂寫也不為過。在Python2有穩定的套件,在Firebird官網裡可以找到。但Python3目前只有下面這一套:

[firebirdsql 0.63]
下載位置--->http://pypi.python.org/pypi/firebirdsql/0.6.3

這一套我有安裝成功,但使用上一直搞不懂它執行的邏輯在哪裡,是說連原資料庫的相關資料都很少...等這套件在發展一段時間會再去研究,也許會是一顆尚未雕刻的璞玉。

泛用型兵器

[pyquery] 抓網頁資料的神器

前幾年以網路有的中文資料,用python抓網頁是個很複雜的動作。使用lxml這個強大的第三方套件,對,他很強,但可能我天資駑鈍,實在太難用了。抓一個資料還得去查他在網頁裡的xpath,查出來也不一定吃(我自己試用發現吃不了<tbody>標籤組),如果有個像phpquery一樣,我只要知道我要抓的資料位置所在的id,甚至知道是第幾個甚麼標籤,那不就方便許多了嗎?
所幸過了一年後,神聽到我的請求,pyquery降臨了
首先由於該套件是以lxml作為底層剖析引擎,所以先到下列網址下載安裝
http://pypi.python.org/pypi/lxml/2.3.2
不過上面網址只有釋放原始碼,要自己打指令安裝
如果你的作業系統是Windows,有福了,這邊有一指安裝檔,在下列網頁內
http://www.lfd.uci.edu/~gohlke/pythonlibs/
找尋lxml-2.3.2,然後根據你的版本選擇安裝檔

安裝好了,接下來就是主菜了

pypi把套件下載下來http://pypi.python.org/pypi/pyquery
由於pyquery沒有製作一指安裝檔,所以不管哪種作業系統都要打指令。
將套件下載下來,解壓縮後,以命令列的方式進入套件的目錄,然後執行

python setup.py install

帶著禱告的心情按下Enter鍵,如果沒有出現安裝錯誤,水!

裝好了之後就要來測試一下
首先我們來試試看台灣yahoo
假設我們要抓取奇摩的<title></title>之間的值,該如何做呢?
請輸入以下的程式碼

from pyquery import PyQuery as pq
q = pq(url='http://tw.yahoo.com/')
print(q('title').text())

執行,你就會發現...

Yahoo!奇摩

怎麼會這麼簡單!!!

也許你會問,那可不可以用CSS的方式來抓呢?

假設我們要抓<a>標籤中屬於tag_fashion這個class的資料
把上面的程式碼中最後一行換成下面

print(q('a').filter('.tag_fashion').text())

各位有興趣自己試試看結果如何,ID值的道理也是一樣,把小數點換成#就可以了

不過又會有人問了:可是如果我要抓的資料位置沒辦法用ID方式指定,那該怎麼辦?
依然不難,該套件可以支援比如說我要抓第五個<p>標籤內的內容,方式如下

q('p').eq(4).text()

p.s. 用4的原因是因為python是以0開始記數,所以0是代表第1筆資料,4代表第5筆資料

一切就像做一塊小蛋糕一樣簡單

小弟今天就先寫到這,以後有緣會在介紹一些其他的應用。如果等不及,可以先看官方的說明文件http://packages.python.org/pyquery/index.html 。希望小弟的文章有幫到大家,再會~

2011年11月13日 星期日

字串純化成數字



相信很多人平常會遇到在抓取網頁時,資料似乎沒有那麼純,比如說2,000中間多個逗號,要是強制轉為整數,呆呆的python肯定是要跟你翻臉。

那麼我們要做的變是純化數字,方法如下:

比如說我們要把這樣的字串12dff412df54純化成1241254

''.join([x for x in '12dff412df54' if x.isdigit()])


P.S.以上資訊感謝PTT之juiz提供