2016-07-20 1 views
4

시도 할 때 다른 답변의 솔루션이 작동하지 않습니다. 해당 메서드를 사용해도 동일한 문자열 출력이 표시됩니다.앰퍼샌드 해시 문자열 디코드 (& # 124 & # 120 & # 97)

파이썬 2.7을 사용하여 웹 스크래핑을하려고합니다. 나는 웹 페이지를 다운로드 받았고 어떤 형태의 문자가 &#120이고 120은 ASCII 코드를 나타내는 것으로 보인다. 내가 HTMLParser()decode() 방법을 사용했지만 아무것도 작동하는 것 같아요. 형식으로 웹 페이지에서 가져온 내용은 ​​해당 문자뿐입니다. 예 :

&#66&#108&#97&#115&#116&#101&#114&#106&#97&#120&#120&#32 

이 나를 인도 해주십시오 파이썬을 사용하여 이러한 문자열을 디코딩합니다. 나는 다른 해답을 읽었으나 해결책은 나를 위해 일하지 않는 것처럼 보인다.

+0

그들은 유효한 [문자 참조]하지 (https://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references#Character_reference_overview) : 그들은 세미콜론 누락되었습니다. 일단 세미콜론이 추가되면, 그 예제는'Blasterjaxx'로 디코드합니다. –

+3

페이지를 다운로드 할 때 인코딩을 명시 적으로 지정하십시오. – frist

답변

4

당신이 무슨 일을하는지에 따라, 당신은 유효한 해당 데이터를 변환 할 수 있습니다 HTML character references이므로 적절한 HTML 구문 분석기를 사용하여 구문 분석 할 수 있습니다.

그러나 숫자 문자열을 추출하여 동일한 ASCII 문자로 쉽게 변환 할 수 있습니다. 예,

s ='&#66&#108&#97&#115&#116&#101&#114&#106&#97&#120&#120&#32' 
print ''.join([chr(int(u)) for u in s.split('&#') if u]) 

출력

Blasterjaxx 

s는 분할 문자열 '&#'로 시작하기 때문에 우리가 얻을 초기 빈 문자열에 걸친 if u 건너 뜁니다. 또한, 우리는 슬라이스하여 건너 뛸 수 :

''.join([chr(int(u)) for u in s.split('&#')[1:]]) 
3

문자 참조의 올바른 형식은 &#nnnn;이므로 예에서 ;이 누락되었습니다. 당신은 ; 추가 한 다음 HTMLParser.unescape()를 사용할 수 있습니다 : 이것은이 출력 제공

from HTMLParser import HTMLParser 
import re 
x ='&#66&#108&#97&#115&#116&#101&#114&#106&#97&#120&#120&#32' 
x = re.sub(r'(&#[0-9]*)', r'\1;', x) 
print x 
h = HTMLParser() 
print h.unescape(x) 

:

Blasterjaxx  
Blasterjaxx