2014-10-31 16 views
0

我有一個庫,第三方開發人員使用它來從幾個特定網站獲取信息。該庫負責連接到網站,抓取頁面,解析必要的信息,並將其返回給開發人員。使用Python記錄庫環境中的HTML內容

但是,我遇到了一個可接受的方式來處理存儲可能畸形的HTML的問題。由於我在測試時只能考慮如此多的事情,將來解析可能會失敗,如果我能找到一種方法來存儲解析失敗的HTML以備將來修復錯誤,那將會很有幫助。

現在我正在使用Python的內部日誌記錄模塊來處理我的庫中的日誌記錄。我允許第三方開發人員提供配置字典來配置日誌輸出錯誤數據的方式。但是,打印HTML到控制檯甚至是文件對我來說都不是理想的,因爲我認爲它會混亂終端或錯誤日誌。我考慮將HTML文件存儲在本地硬盤上,但這看起來非常具有侵擾性。

我已經確定了我將如何在內部通過HTML。我的計劃是通過一個異常的參數傳遞它,然後用Filter來捕獲它。但是,如何處理它真的讓我感到困擾。

任何有關完成此方法的反饋意見。

回答

0

基於您不控制的網站的服務可能會有些脆弱,因此存儲HTML以避免在解析問題時重新抓取對我來說非常有意義。由於未壓縮的HTML會消耗磁盤上的大量空間,因此可能需要將其以壓縮格式存儲在數據庫中。

我發現MongoDB對此很方便。底層存儲格式是BSON(即二進制JSON)。這也很容易安裝和使用。

下面是使用PyMongo存儲該頁面在MongoDB中的玩具例子:

from pymongo import MongoClient 
import urllib2 
import time 

# what will be stored in the document 
ts = time.time() 
url = 'http://stackoverflow.com/questions/26683772/logging-html-content-in-a-library-environment-with-python' 
html = urllib2.urlopen(url).read() 

# create a dict and store it in MongoDB 
htmlDict = {'url':url, 'ts':ts, 'html':html} 
client = MongoClient() 
db = client.html_log 
collection = db.html 
collection.insert(htmlDict) 

檢查看到,文檔存儲在MongoDB中:

$ mongo 
> use html_log; 
> db.html.find() 
{ "_id" : ObjectId("54544d96164a1b22d3afd887"), "url" : "http://stackoverflow.com/questions/26683772/logging-html-content-in-a-library-environment-with-python", "html" : "<!DOCTYPE html> [...] </html>", "ts" : 1414810778.001168 } 
+0

謝謝,但這是什麼之間的差異只是壓縮一個HTML文件?將另一個依賴項添加到我的庫中也不太理想。 – 2014-11-01 04:43:19

+0

我同意這可能對你沒有意義。這就是爲什麼我可能會在類似的情況下做到這一點:假設我收集了大量數據並需要快速重新解析(即在羣集上)。 gzip解決方案可能會創建大量文件(可能有問題),或者非常大的gzip文件無法在「塊」中處理,而無需首先解壓整個文件。 '用Mongo即時保管'的方法讓你可以輕鬆地在集羣上重新處理(例如使用mongo-hadoop),並且對Python代碼進行最少量的更改。 – 2014-11-01 16:01:46