[python] 파이썬 문자열로 HTML 엔터티를 디코딩 하시겠습니까?

Beautiful Soup 3으로 일부 HTML을 구문 분석하고 있지만 Beautiful Soup 3에서 자동으로 디코딩하지 않는 HTML 엔티티가 포함되어 있습니다.

>>> from BeautifulSoup import BeautifulSoup

>>> soup = BeautifulSoup("<p>&pound;682m</p>")
>>> text = soup.find("p").string

>>> print text
&pound;682m

어떻게에서 HTML 엔티티 디코딩 할 수 text얻는 "£682m"대신을 "&pound;682m".



답변

파이썬 3.4+

사용 html.unescape():

import html
print(html.unescape('&pound;682m'))

FYI html.parser.HTMLParser.unescape는 더 이상 사용되지 않으며 실수로 남아 있지만 3.5 에서 제거되어야합니다 . 언어에서 곧 제거 될 것입니다.


파이썬 2.6-3.3

HTMLParser.unescape()표준 라이브러리에서 사용할 수 있습니다 .

>>> try:
...     # Python 2.6-2.7 
...     from HTMLParser import HTMLParser
... except ImportError:
...     # Python 3
...     from html.parser import HTMLParser
...
>>> h = HTMLParser()
>>> print(h.unescape('&pound;682m'))
£682m

six호환성 라이브러리를 사용하여 가져 오기를 단순화 할 수도 있습니다 .

>>> from six.moves.html_parser import HTMLParser
>>> h = HTMLParser()
>>> print(h.unescape('&pound;682m'))
£682m


답변

뷰티플 수프는 개체 변환을 처리합니다. Beautiful Soup 3에서는 다음을 지정해야합니다.convertEntitiesBeautifulSoup 생성자에 인수 ( 보관 된 문서 의 ‘엔티티 변환’ 섹션 참조 ). Beautiful Soup 4에서는 엔티티가 자동으로 디코딩됩니다.

아름다운 수프 3

>>> from BeautifulSoup import BeautifulSoup
>>> BeautifulSoup("<p>&pound;682m</p>",
...               convertEntities=BeautifulSoup.HTML_ENTITIES)
<p682m</p>

아름다운 수프 4

>>> from bs4 import BeautifulSoup
>>> BeautifulSoup("<p>&pound;682m</p>")
<html><body><p682m</p></body></html>


답변

w3lib.html 라이브러리에서 replace_entities를 사용할 수 있습니다

In [202]: from w3lib.html import replace_entities

In [203]: replace_entities("&pound;682m")
Out[203]: u'\xa3682m'

In [204]: print replace_entities("&pound;682m")
£682m


답변

Beautiful Soup 4를 사용하면 포맷터를 출력 으로 설정할 수 있습니다

를 전달 formatter=None하면 Beautiful Soup은 출력시 문자열을 전혀 수정하지 않습니다. 가장 빠른 옵션이지만 다음 예제와 같이 Beautiful Soup에서 잘못된 HTML / XML을 생성 할 수 있습니다.

print(soup.prettify(formatter=None))
# <html>
#  <body>
#   <p>
#    Il a dit <<Sacré bleu!>>
#   </p>
#  </body>
# </html>

link_soup = BeautifulSoup('<a href="http://example.com/?foo=val1&bar=val2">A link</a>')
print(link_soup.a.encode(formatter=None))
# <a href="http://example.com/?foo=val1&bar=val2">A link</a>


답변

비슷한 인코딩 문제가있었습니다. normalize () 메서드를 사용했습니다. 내 데이터 프레임을 다른 디렉토리의 .html 파일로 내보낼 때 pandas .to_html () 메소드를 사용하여 유니 코드 오류가 발생했습니다. 나는 이것을 끝내고 효과가 있었다 …

    import unicodedata 

데이터 프레임 객체는 원하는대로 할 수 있습니다. 테이블이라고 부릅니다.

    table = pd.DataFrame(data,columns=['Name','Team','OVR / POT'])
    table.index+= 1

테이블 데이터를 인코딩하여 템플릿 폴더의 .html 파일로 내보낼 수 있습니다 (원하는 위치에 관계없이 가능)

     #this is where the magic happens
     html_data=unicodedata.normalize('NFKD',table.to_html()).encode('ascii','ignore')

정규화 된 문자열을 HTML 파일로 내보내기

    file = open("templates/home.html","w")

    file.write(html_data)

    file.close() 

참조 : 유니 코드 데이터 문서


답변

이것은 아마도 여기에 관련이 없습니다. 그러나 전체 문서에서 이러한 HTML entites를 제거하려면 다음과 같이 할 수 있습니다. 이).

import re
import HTMLParser

regexp = "&.+?;"
list_of_html = re.findall(regexp, page) #finds all html entites in page
for e in list_of_html:
    h = HTMLParser.HTMLParser()
    unescaped = h.unescape(e) #finds the unescaped value of the html entity
    page = page.replace(e, unescaped) #replaces html entity with unescaped value


답변