Beautiful Soup 3으로 일부 HTML을 구문 분석하고 있지만 Beautiful Soup 3에서 자동으로 디코딩하지 않는 HTML 엔티티가 포함되어 있습니다.
>>> from BeautifulSoup import BeautifulSoup
>>> soup = BeautifulSoup("<p>£682m</p>")
>>> text = soup.find("p").string
>>> print text
£682m
어떻게에서 HTML 엔티티 디코딩 할 수 text
얻는 "£682m"
대신을 "£682m"
.
답변
파이썬 3.4+
사용 html.unescape()
:
import html
print(html.unescape('£682m'))
FYI html.parser.HTMLParser.unescape
는 더 이상 사용되지 않으며 실수로 남아 있지만 3.5 에서 제거되어야합니다 . 언어에서 곧 제거 될 것입니다.
파이썬 2.6-3.3
HTMLParser.unescape()
표준 라이브러리에서 사용할 수 있습니다 .
- Python 2.6-2.7의 경우
HTMLParser
- 파이썬 3의 경우
html.parser
>>> try:
... # Python 2.6-2.7
... from HTMLParser import HTMLParser
... except ImportError:
... # Python 3
... from html.parser import HTMLParser
...
>>> h = HTMLParser()
>>> print(h.unescape('£682m'))
£682m
six
호환성 라이브러리를 사용하여 가져 오기를 단순화 할 수도 있습니다 .
>>> from six.moves.html_parser import HTMLParser
>>> h = HTMLParser()
>>> print(h.unescape('£682m'))
£682m
답변
뷰티플 수프는 개체 변환을 처리합니다. Beautiful Soup 3에서는 다음을 지정해야합니다.convertEntities
BeautifulSoup
생성자에 인수 ( 보관 된 문서 의 ‘엔티티 변환’ 섹션 참조 ). Beautiful Soup 4에서는 엔티티가 자동으로 디코딩됩니다.
아름다운 수프 3
>>> from BeautifulSoup import BeautifulSoup
>>> BeautifulSoup("<p>£682m</p>",
... convertEntities=BeautifulSoup.HTML_ENTITIES)
<p>£682m</p>
아름다운 수프 4
>>> from bs4 import BeautifulSoup
>>> BeautifulSoup("<p>£682m</p>")
<html><body><p>£682m</p></body></html>
답변
w3lib.html 라이브러리에서 replace_entities를 사용할 수 있습니다
In [202]: from w3lib.html import replace_entities
In [203]: replace_entities("£682m")
Out[203]: u'\xa3682m'
In [204]: print replace_entities("£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