【问题标题】:Get content-type from HTML page with BeautifulSoup使用 BeautifulSoup 从 HTML 页面获取内容类型
【发布时间】:2011-03-23 20:33:43
【问题描述】:

我正在尝试获取我抓取的页面的字符编码,但在某些情况下它会失败。这是我正在做的事情:

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

这是我的第一次尝试。但如果 charset 以 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' 对象没有属性 'lower'

第二个 try 语句有什么问题?我猜第一个也是不正确的,因为它抛出了一个错误,而不仅仅是返回空白。

或者更好有没有更优雅的方法来从页面中删除任何特殊字符编码?我试图完成的最终结果是我不关心任何特殊编码的字符。我想删除编码字符并保留原始文本。我可以跳过以上所有内容并告诉 BeautifulSoup 只删除任何已编码的内容吗?

【问题讨论】:

    标签: python lambda 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 
    

    【讨论】:

      【解决方案2】:

      在尝试确定页面的字符编码时,我认为应该尝试的顺序是:

      1. 通过元标记(例如<meta http-equiv="Content-Type" content="text/html; charset=utf-8">)从 HTML 页面本身确定
      2. 通过 HTTP 标头确定编码(例如 Content-Type: text/html; charset=ISO-8859-1
      3. 最后,如果以上没有产生任何结果,您可以使用算法来确定页面的字符编码,使用其中的字节分布来确定页面的字符编码(请注意,不能保证找到正确的编码) .查看 chardet 库以了解此选项。

      【讨论】:

      • 是的,但即使在我最初问题的第一个尝试语句中,我也在尝试您的 #1,但它会引发错误。不知道为什么。
      猜你喜欢
      • 1970-01-01
      • 2015-03-11
      • 1970-01-01
      • 2017-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多