복붙노트

[PYTHON] urllib2 유니 코드로 읽음

PYTHON

urllib2 유니 코드로 읽음

나는 어떤 언어든지에있을 수있는 위치의 내용을 저장할 필요가있다. 그리고 유니 코드 문자열에 대한 내용을 검색 할 수 있어야합니다.

나는 다음과 같은 것을 시도했다.

import urllib2

req = urllib2.urlopen('http://lenta.ru')
content = req.read()

내용은 바이트 스트림이므로 유니 코드 문자열을 검색 할 수 있습니다.

urlopen을 할 때 헤더로부터 charset을 사용하여 내용을 디코딩하고 UTF-8로 인코딩하는 방법이 필요합니다.

해결법

  1. ==============================

    1.수행 한 작업이 완료되면 다음과 같이 표시됩니다.

    수행 한 작업이 완료되면 다음과 같이 표시됩니다.

    >>> req.headers['content-type']
    'text/html; charset=windows-1251'
    

    그래서 :

    >>> encoding=req.headers['content-type'].split('charset=')[-1]
    >>> ucontent = unicode(content, encoding)
    

    ucontent는 이제 유니 코드 문자열 (140655 자)입니다. 예를 들어 터미널이 UTF-8 인 경우 일부만 표시 할 수 있습니다.

    >>> print ucontent[76:110].encode('utf-8')
    <title>Lenta.ru: Главное: </title>
    

    그리고 당신은 등등을 검색 할 수 있습니다.

    편집 : 유니 코드 입출력은 일반적으로 까다 롭습니다 (이것은 원래의 물음표를 붙잡고있는 것일 수 있습니다).하지만 대화식 파이썬 인터프리터에 유니 코드 문자열을 입력하는 어려운 문제를 우회하려고합니다. 일단 유니 코드 문자열이 올바르게 입력되면 (코드 포인트에 의해 수행됩니다 - 까다 롭지 만 까다 롭지는 않지만 ;-), 검색은 절대적으로 생각할 필요가 없습니다. (따라서 원래의 질문에 철저하게 답변되었습니다). 다시 UTF-8 단말기를 가정합니다.

    >>> x=u'\u0413\u043b\u0430\u0432\u043d\u043e\u0435'
    >>> print x.encode('utf-8')
    Главное
    >>> x in ucontent
    True
    >>> ucontent.find(x)
    93
    

    참고 : 일부 사이트는 게재 된 문서 내에서 문자 인코딩 만 지정하므로 (예 : http-equiv 메타 태그 사용)이 방법은 모든 사이트에서 작동하지 않을 수 있습니다.

  2. ==============================

    2.Content-Type http 헤더를 파싱하려면 cgi.parse_header 함수를 사용할 수 있습니다.

    Content-Type http 헤더를 파싱하려면 cgi.parse_header 함수를 사용할 수 있습니다.

    import cgi
    import urllib2
    
    r = urllib2.urlopen('http://lenta.ru')
    _, params = cgi.parse_header(r.headers.get('Content-Type', ''))
    encoding = params.get('charset', 'utf-8')
    unicode_text = r.read().decode(encoding)
    

    charset을 얻는 또 다른 방법은 다음과 같습니다.

    >>> import urllib2
    >>> r = urllib2.urlopen('http://lenta.ru')
    >>> r.headers.getparam('charset')
    'utf-8'
    

    또는 Python 3 :

    >>> import urllib.request
    >>> r = urllib.request.urlopen('http://lenta.ru')
    >>> r.headers.get_content_charset()
    'utf-8'
    

    문자 인코딩은 HTML 문서 내에서 지정할 수도 있습니다 (예 : ).

  3. from https://stackoverflow.com/questions/1020892/urllib2-read-to-unicode by cc-by-sa and MIT license