Python:在不添加转义字符的情况下将原始字符串转换为字节字符串
Python: Convert Raw String to Bytes String without adding escape chraracters
我有一个字符串:
'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'
但我不断收到:
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)
我使用的包是requests
、lxml.html
、re
和bz2
。
再一次,我的目标是使用 bz2
解压缩 un
,但是我很难从我的网络抓取过程中获取类似字节的对象。
有什么指点吗?
如果我正确理解您的目标,可以通过以下方式实现:
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'
如果这还不够的话,在此 SO post 上对此进行了很好的讨论。他们讨论了(根据 PEP)将 UTF-8 字符串编码为字节数组的最佳方法以及 class 涉及的其他方法。
您的错误早先存在。唯一可接受的解决方案是更改抓取代码,使其 returns 成为字节对象而不是文本对象。不要尝试 "convert" 你的字符串 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 字符,您的数据将会损坏。
Web 抓取代码无法将 bz2 编码的字节作为 str
返回,因此您需要解决问题的 原因 ,而不是试图处理这些症状。
我有一个字符串:
'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'
但我不断收到:
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)
我使用的包是requests
、lxml.html
、re
和bz2
。
再一次,我的目标是使用 bz2
解压缩 un
,但是我很难从我的网络抓取过程中获取类似字节的对象。
有什么指点吗?
如果我正确理解您的目标,可以通过以下方式实现:
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'
如果这还不够的话,在此 SO post 上对此进行了很好的讨论。他们讨论了(根据 PEP)将 UTF-8 字符串编码为字节数组的最佳方法以及 class 涉及的其他方法。
您的错误早先存在。唯一可接受的解决方案是更改抓取代码,使其 returns 成为字节对象而不是文本对象。不要尝试 "convert" 你的字符串 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 字符,您的数据将会损坏。
Web 抓取代码无法将 bz2 编码的字节作为 str
返回,因此您需要解决问题的 原因 ,而不是试图处理这些症状。