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

2024-06-16 09:41:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一根绳子:

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

我想要:

^{pr2}$

但我一直得到:

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: 谢谢你的帮助! @我现在明白你的意思了,但我不知道如何从我的网络垃圾收集方法中检索到一个类似字节的对象:

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.htmlre和{}。在

再一次,我的目标是使用bz2解压un,但是我很难从我的webscraping过程中获得一个类似字节的对象。在

有什么建议吗?在


Tags: 对象re字节htmlcommentunx00x82
2条回答

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

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)

结果是:

^{pr2}$

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

你的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”只是一种拉丁语-1编码,它为外部的字符提供了一个内置的回退机制。此编码对其他代码点使用\uxxx和\UXXXXXXXX。现有的反斜杠不会以任何方式转义。它在Python pickle协议中使用。对于不能用\xXX序列表示的Unicode字符,数据将损坏。

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

相关问题 更多 >