2011-03-23 86 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