3

Webページから文字セットを取得しようとしています(これは常に変化します)。現時点では、beautifulSoup を使用してページを解析し、ヘッダーから文字セットを抽出しています。これは、あるサイトに出くわすまでは正常に機能していました.....

    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">

これまでの私のコードで、他のページで動作していたのは次のとおりです。

    def get_encoding(soup):
        encod = soup.meta.get('charset')
        if encod == None:
            encod = soup.meta.get('content-type')
            if encod == None:
                encod = soup.meta.get('content')
    return encod

上記の例から文字セットを取得するためにこのコードに追加する方法について、誰もが良い考えを持っていますか? それをトークン化し、そのように文字セットを取得しようとするのはアイデアでしょうか? そして、機能全体を変更することなく、どのようにそれを行うでしょうか? 現在、上記のコードは "text/html; charset=utf-8" を返していますが、これは不明なエンコーディングであるため、LookupError を引き起こしています。

ありがとう

最終的に使用したコードは次のとおりです。

    def get_encoding(soup):
        encod = soup.meta.get('charset')
        if encod == None:
            encod = soup.meta.get('content-type')
            if encod == None:
                content = soup.meta.get('content')
                match = re.search('charset=(.*)', content)
                if match:
                    encod = match.group(1)
                else:
                    dic_of_possible_encodings = chardet.detect(unicode(soup))
                    encod = dic_of_possible_encodings['encoding'] 
    return encod
4

2 に答える 2

4
import re
def get_encoding(soup):
    if soup and soup.meta:
        encod = soup.meta.get('charset')
        if encod == None:
            encod = soup.meta.get('content-type')
            if encod == None:
                content = soup.meta.get('content')
                match = re.search('charset=(.*)', content)
                if match:
                    encod = match.group(1)
                else:
                    raise ValueError('unable to find encoding')
    else:
        raise ValueError('unable to find encoding')
    return encod
于 2013-08-21T13:48:04.297 に答える