2011-03-23 92 views
1

我試圖獲取我刮的頁面的字符編碼,但在某些情況下它失敗了。這是我在做什麼:從BeautifulSoup的HTML頁面獲取內容類型

resp = urllib2.urlopen(request) 
self.COOKIE_JAR.extract_cookies(resp, request) 
content = resp.read() 
encodeType= resp.headers.getparam('charset') 
resp.close() 

這是我第一次嘗試。但是,如果字符集回來爲None類型,我這樣做:

soup = BeautifulSoup(html) 
if encodeType == None: 
    try: 
     encodeType = soup.findAll('meta', {'http-equiv':lambda v:v.lower()=='content-type'}) 
    except AttributeError, e: 
     print e 
     try: 
      encodeType = soup.findAll('meta', {'charset':lambda v:v.lower() != None}) 
     except AttributeError, e: 
      print e 
      if encodeType == '': 
       encodeType = 'iso-8859-1' 

的頁面,我測試了這個在標題: <meta charset="ISO-8859-1">

我希望第一個try語句返回一個空字符串,但我得到兩個try語句(這就是爲什麼第二個語句嵌套現在)這個錯誤:

「NoneType」對象有沒有屬性「低」

什麼是錯的第二個try語句?我猜測第一個也是不正確的,因爲它會拋出一個錯誤,而不是回到空白。

或更好的是否有一個更優雅的方式來從頁面中刪除任何特殊字符編碼?我試圖完成的最終結果是我不關心任何特殊編碼的字符。我想刪除編碼的字符並保留原始文本。我可以跳過上述所有內容嗎?告訴BeautifulSoup去除任何編碼的東西?

回答

1

我決定只是去任何BeautifulSoup吐出來。然後,當我解析文檔中的每個單詞時,如果我無法將其轉換爲字符串,我只是無視它。

for word in doc.lower().split(): 
     try: 
      word = str(word) 
      word = self.handlePunctuation(word) 
      if word == False: 
       continue 
     except UnicodeEncodeError, e: 
      #word couldn't be converted to string; most likely encoding garbage we can toss anyways 
      continue 
0

當試圖確定一個頁面的字符編碼,我認爲,應該嘗試的順序是:

  1. 從HTML頁面本身通過meta標籤(如<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  2. 通過確定編碼確定HTTP頭(例如Content-Type: text/html; charset=ISO-8859-1
  3. 最後,如果上述內容沒有產生任何內容,您可以使用一種算法來確定頁面的字符編碼,使用它內部的字節分佈(注意不是保證找到正確的編碼)。查看此選項的chardet庫。
+0

是的,但即使在我原來的問題的第一次嘗試聲明中,我正在嘗試你的#1,但它會引發錯誤。無法弄清楚原因。 – Nathan 2011-03-24 03:09:32