解析 XML/HTML 的 Library 有很多,但大部份都只支援 Well-formed XML,遇到 Mal-formed XML 就無法解析,Standard Library 裡面的都屬於此類。可以接受 Mal-formed XML 的 Library 則有以下這些:
- lxml
- 據說是目前 Python 最好的 XML Parser,但不是純 Python 寫的,不能在 Google App Engine 上使用1。有人開 ticket 請 Google 裝,不過優先度並不高。
- html5lib
- HTML5 標準函式庫,在查詢元素方面除了介接 Beautiful Soup、ElementTree、lxml 等既有 Library 以外,還額外提供了一個新的 simpletree 格式,其目標是提供一個最基本的實作,並沒有擴充的打算,查詢起來費時又費力。
- Beautiful Soup
- 相當老牌的 XML Parser,有自己的一套查詢元素的作法。
所以解決方案有這些:
- Beautiful Soup
- 這是 dependency 最低的作法,Beautiful Soup 自己的查詢方法其實也還不錯用,但由於查詢經常是使用正規表達式描述,當 HTML 格式變動的時候維護成本可能會比較大。
- html5lib + ElementTree
- 此作法的原理是讓 html5lib 將原始 HTML 處理成 Well-formed 格式2,然後再用 ElementTree 來作查詢,ElementTree 查詢的方法非常類似 XPath3,很人性化。
- Beautiful Soup + ElementTree + ElementSoup
- 此作法的原理是讓 BeautifulSoup 將原始 HTML 處理成 Well-formed 格式,然後再用 ElementTree 來作查詢。ElementSoup 則是用來幫忙把 Beautiful Soup 格式轉換為 ElementTree 格式。
目前我是用 Beautiful Soup。最後我決定在本地端 parse 完再丟上去… XD
-
Google App Engine SDK 1.5.5 以後的版本新增了 Python 2.7 的支援,如果指定使用 Python 2.7 的話,就能使用系統提供的 lxml。 ↩
-
html5lib 的原理是由它來處理原始資料、製成 DOM、ElementTree 的格式,然後再用 DOM、ElementTree 來查詢,所以解析時間並不會比 Beautiful Soup 快。 ↩
-
ElementTree 1.3 版以前還不支援對屬性查詢,而 Python 是在 2.7 版才將內建的 ElementTree 更新為 1.3,不過我們可以從 Python SVN 取得最新版的 ElementTree,放到 Google App Engine 上使用,缺點是速度沒有 cElementTree 快。 ↩
The post 在 Google App Engine 上解析 HTML appeared first on Grey Lee.