5

我有一个字符串:

'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)

我使用的包是requestslxml.htmlrebz2

再一次,我的目标是使用 解压缩unbz2但我很难从我的网络抓取过程中获取字节类对象。

任何指针?

4

2 回答 2

2

您的错误较早存在。唯一可接受的解决方案是更改抓取代码,使其返回字节对象而不是文本对象。不要尝试将您的字符串“转换”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 和 \UXXXXXXXXXX 用于其他代码点。现有的反斜杠不会以任何方式转义。它用于 Python pickle 协议。对于无法表示为 \xXX 序列的 Unicode 字符,您的数据将损坏。

Web 抓取代码没有业务将 bz2 编码的字节返回为 a str,因此您需要解决问题的原因,而不是尝试处理症状。

于 2018-07-21T15:50:40.897 回答
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'

如果这还不够的话,在这个 SO帖子上有一个很好的讨论。他们讨论了将 UTF-8 字符串编码为字节数组的最佳方法(根据 PEP)以及该类涉及的其他方法。

于 2018-07-21T15:47:28.100 回答