문제

여기에서 HTML 항목을 해독하려고합니다 nytimes.com 그리고 내가 무엇을 잘못하고 있는지 알 수 없습니다.

예를 들어 :

"U.S. Adviser’s Blunt Memo on Iraq: Time ‘to Go Home’"

BeautifulSoup, Decode ( 'ISO-8859-1') 및 django.utils.encoding의 smart_str를 성공적으로 시도하지 않았습니다.

도움이 되었습니까?

해결책

이 시도:

import re

def _callback(matches):
    id = matches.group(1)
    try:
        return unichr(int(id))
    except:
        return id

def decode_unicode_references(data):
    return re.sub("&#(\d+)(;|(?=\s))", _callback, data)

data = "U.S. Adviser’s Blunt Memo on Iraq: Time ‘to Go Home’"
print decode_unicode_references(data)

다른 팁

실제로 당신이 가진 것은 HTML 엔티티가 아닙니다. 그것의 세 가지 품종이 있습니다. 사물 - 예를 들어       모든 평균 U+00A0 No-Break 공간.

  (유형)는 "숫자 문자 참조"(소수)입니다.
  "숫자 문자 참조"(16 진수)입니다.
  엔티티입니다.

추가 읽기 : http://htmlhelp.com/reference/html40/entities/

여기에는 입력을 통해 한 번의 스캔에서 세 가지를 모두 수행하는 Python2.x에 대한 코드가 있습니다. http://effbot.org/zone/re-sub.htm#unescape-html

>>> from HTMLParser import HTMLParser
>>> print HTMLParser().unescape('U.S. Adviser’s Blunt Memo on Iraq: '
...                             'Time ‘to Go Home’')
U.S. Adviser’s Blunt Memo on Iraq: Time ‘to Go Home’

이 함수는 파이썬 2에서 문서화되지 않습니다. 파이썬 3.4+에 고정되어 있습니다: 그것은 다음과 같이 노출됩니다 html.unescape() 거기.

이것은 작동합니다 :

from BeautifulSoup import BeautifulStoneSoup
s = "U.S. Adviser’s Blunt Memo on Iraq: Time ‘to Go Home’"
decoded = BeautifulStoneSoup(s, convertEntities=BeautifulStoneSoup.HTML_ENTITIES)

유니 코드 객체 대신 문자열을 원한다면 사용중인 문자를 지원하는 인코딩으로 디코딩해야합니다. ISO-8859-1은 다음과 같습니다.

result = decoded.encode("UTF-8")

불행히도 이와 같은 외부 모듈이 필요하다는 것은 불행한 일입니다. 간단한 HTML/XML 엔터티 디코딩은 표준 라이브러리에 있어야하며 "BeautifulStonesoup"과 같은 의미없는 클래스 이름을 가진 라이브러리를 사용할 필요가 없습니다. (클래스와 기능 이름은 "창의적"이어서는 안됩니다. 의미가 있어야합니다.)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top