我有一个字符串:
'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我明白您现在的意思,但是我对于如何从我的webscraping方法中检索类似字节的对象感到茫然:
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
。
再一次,我的目标是使用un
解压缩bz2
,但是我很难从网络抓取过程中获得类似字节的对象。
有指针吗?
答案 0 :(得分:1)
您的错误较早存在。唯一可接受的解决方案是更改抓取代码,以使其返回字节对象而不是文本对象。请勿尝试将字符串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
返回,因此您需要在这里解决问题的原因,而不是尝试处理症状。
答案 1 :(得分: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'
如果还不够的话,请在此post上对此进行很好的讨论。他们讨论了将UTF-8字符串编码为字节数组的最佳方法(根据PEP)以及该类涉及的其他方法。