파이썬으로 HTML 엔티티를 디코딩합니다
-
05-07-2019 - |
문제
여기에서 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"과 같은 의미없는 클래스 이름을 가진 라이브러리를 사용할 필요가 없습니다. (클래스와 기능 이름은 "창의적"이어서는 안됩니다. 의미가 있어야합니다.)