阻止BeautifulSoup的renderContents()更改为

时间:2018-06-17 05:32:22

标签: python python-3.x utf-8 beautifulsoup

我正在使用bs4对某些文字进行一些处理,但在某些情况下,它会将 个字符转换为Â。我能说的最好的是这是encoding mismatch from UTF-8 to latin1(或反向?)

我的网络应用程序中的所有内容都是UTF-8,Python3是UTF-8,我已经确认数据库是UTF-8。

我已将问题缩小到这一行:

print("Before soup: " + text)  # Before soup:  
soup = BeautifulSoup(text, "html.parser")
#.... do stuff to soup, but all commented out for this testing.
soup = BeautifulSoup(soup.renderContents(), "html.parser")  # <---- PROBLEM!
print(soup.renderContents())  # b'\xc3\x82\xc2\xa0'
print("After SOUP: " + str(soup))  # After SOUP: Â

如何阻止renderContents()更改编码?这个函数有no documentation

编辑:进一步研究文档后,this seems to be the key,但我仍然无法解决问题!

print(soup.prettify(formatter="html"))  # &Acirc;&nbsp;

1 个答案:

答案 0 :(得分:0)

好的,显然我没有仔细阅读文档,这里可以找到答案:

来自https://www.crummy.com/software/BeautifulSoup/bs4/doc/#encodings

问题是提供给BS的代码片段太短,而BeautifulSoup的子库Unicode, Dammit没有足够的信息来正确猜测编码。

  

Unicode, Dammit大部分时间都在正确猜测,但有时也是如此   犯错误。你可以避免   将错误和延迟传递给BeautifulSoup构造函数   from_encoding

所以关键是每次构建BS时都要添加from_encoding="UTF-8"

soup = BeautifulSoup(soup.renderContents(), "html.parser", from_encoding="UTF-8")