如何将字节串还原为原始字符串?解决北欧字符解码异常问题
解决BeautifulSoup标签bytes转字符串后的还原问题
你的问题出在把bytes对象直接转成字符串(str(b))时,得到的是Python对bytes的repr表示(比如b'xxx'格式),直接用unicode_escape解码会错误解析UTF-8字节序列。下面是可靠的还原方案:
核心思路
要还原出原始的article标签,需要先把这个repr字符串转回真实的bytes对象,再解码成UTF-8文本,最后可以重新用BeautifulSoup解析成标签。
完整代码实现
import ast from bs4 import BeautifulSoup # 你的输入字符串 input_str = 'b\'<article> \n L\xc3\xa4s bl.a. om Gasporox nya m\xc3\xa4tkoncept f\xc3\xb6r tr\xc3\xa5g, en intervju med styrelseledamoten Per Nystr\xc3\xb6m och nyheter fr\xc3\xa5n GPX Medical om bland annat projekten Sinuslight och Neo-Lung.\n</article>\'' # 1. 将repr字符串还原为bytes对象(最可靠的方式) article_bytes = ast.literal_eval(input_str) # 2. 用UTF-8解码bytes,得到原始HTML文本 article_html = article_bytes.decode('utf-8') # 3. 重新解析为BeautifulSoup的article标签(如果需要操作标签的话) soup = BeautifulSoup(article_html, 'html.parser') article = soup.find('article') # 输出结果 print(article.get_text(strip=True)) # 或者打印完整标签结构 print(article.prettify())
为什么之前的方法失效?
你用codecs.getdecoder("unicode_escape")处理时,会把\xc3\xa4这类UTF-8字节当成Unicode转义序列解码,结果得到ä(错误的字符)。而实际上这些是ä的UTF-8编码字节,必须先还原成bytes对象,再用UTF-8解码才能得到正确的北欧字符。
额外说明
ast.literal_eval是处理这类问题的最佳选择,它能安全解析Python的字面量(比如b'xxx'、'xxx'等),避免手动剥离字符串首尾的b'和'可能带来的边界问题(比如字符串内部包含转义的单引号)。
内容的提问来源于stack exchange,提问作者antonstenaxel
相关产品推荐
相关产品推荐

