Python:如何将原始字符串转换为字节字符串而不添加转义字符

4

我有一个字符串:

'BZh91AY&SYA\xaf\x82\r\x00\x00\x01\x01\x80\x02\xc0\x02\x00 \x00!\x9ah3M\x07<]\xc9\x14\xe1BA\x06\xbe\x084'

And I want:

b'BZh91AY&SYA\xaf\x82\r\x00\x00\x01\x01\x80\x02\xc0\x02\x00 \x00!\x9ah3M\x07<]\xc9\x14\xe1BA\x06\xbe\x084'

但是我一直得到以下错误提示:
b'BZh91AY&SYA\\xaf\\x82\\r\\x00\\x00\\x01\\x01\\x80\\x02\\xc0\\x02\\x00 \\x00!\\x9ah3M\\x07<]\\xc9\\x14\\xe1BA\\x06\\xbe\\x084'

上下文

我从网页中获取了一个字符串并将其存储在变量un中。现在我想使用BZip2进行解压缩:

bz2.decompress(un)

然而,由于un是一个str对象,我得到了以下错误:

TypeError: a bytes-like object is required, not 'str'

因此,我需要将un转换为类字节对象,而不更改单个反斜杠为转义反斜杠。
编辑1: 感谢所有的帮助! @wim我现在明白你的意思了,但是我不知道如何从我的网络爬取方法中检索类字节对象:
r = requests.get('http://www.pythonchallenge.com/pc/def/integrity.html')

doc = html.fromstring(r.content)
comment = doc.xpath('//comment()')[0].text.split('\n')[1:3]

pattern = re.compile("[a-z]{2}: '(.+)'")

un = re.search(pattern, comment[0]).group(1)

我正在使用的包括requestslxml.htmlrebz2
再次说明,我的目标是使用bz2解压缩un,但我在从网页抓取过程中获取bytes-like对象方面遇到了困难。
有什么建议吗?

展示转换代码。 - Mad Physicist
您有一些字节,使用了错误的编码进行解码。仅从文本中无法确定使用了哪种错误的编码 - 但看起来像是 latin-1 编码。 - wim
看起来这是一个编程挑战,用户名/密码(huge/file)被故意混淆在HTML注释中。在这种情况下,使用un.encode('raw_unicode_escape')是可以接受的! - wim
2个回答

2

你的 bug 存在于更早的阶段。唯一可接受的解决方案是修改爬取代码,使其返回字节对象而不是文本对象。不要尝试将字符串 un 转换成字节,这样做是不可靠的。

不要这样做:

>>> un = 'BZh91AY&SYA\xaf\x82\r\x00\x00\x01\x01\x80\x02\xc0\x02\x00 \x00!\x9ah3M\x07<]\xc9\x14\xe1BA\x06\xbe\x084'
>>> bz2.decompress(un.encode('raw_unicode_escape'))
b'huge'

"raw_unicode_escape"是一种Latin-1编码,它内置了对其外部字符的回退。该编码使用\uXXXX和\UXXXXXXXX表示其他代码点。现有的反斜杠没有以任何方式转义。它用于Python pickle协议。对于无法表示为\xXX序列的Unicode字符,您的数据将变得损坏。 网络爬虫代码不应将bz2编码的字节作为str返回,因此您需要解决问题的根本原因,而不是试图处理症状。

0

如果我正确理解了你的目标,可以通过以下方式实现:

word = 'BZh91AY&SYA\xaf\x82\r\x00\x00\x01\x01\x80\x02\xc0\x02\x00 \x00!\x9ah3M\x07<]\xc9\x14\xe1BA\x06\xbe\x084'

my_byte_array = word.encode()

print(my_byte_array)

结果显示为:

b'BZh91AY&SYA\xc2\xaf\xc2\x82\r\x00\x00\x01\x01\xc2\x80\x02\xc3\x80\x02\x00 \x00!\xc2\x9ah3M\x07<]\xc3\x89\x14\xc3\xa1BA\x06\xc2\xbe\x084'

如果这还不够,这个SOpost上有一个关于此的很好的讨论。他们谈论了按照PEP编码UTF-8字符串为字节数组和其他方法。


现在尝试使用bz2.decompress解压这些UTF-8编码的字节。 - wim
好的,我几乎可以确定我现在不理解目标了。抱歉,我看到@Bryan Yao的帖子中有`“而且我想要:b'BZh91AY&SYA\xaf\x82\r\x00\x00\x01\x01\x80\x02\xc0\x02\x00 \x00!\x9ah3M\x07<]\xc9\x14\xe1BA\x06\xbe\x084' "`并认为他只是想要一个没有转义字符的字节类型对象。 - Jonathan
@wim,您是正确的,我肯定不能对字节对象进行bz2解压缩-会导致“OSError:无效的数据流”。 - Jonathan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接