如何处理urllib.request.urlopen()的响应编码,以避免TypeError: can't use a string pattern on a bytes-like object

69 投票
7 回答
129121 浏览
提问于 2025-04-16 11:43

我正在尝试使用 urllib.request.urlopen() 打开一个网页,然后用正则表达式搜索内容,但出现了以下错误:

TypeError: can't use a string pattern on a bytes-like object

我明白为什么会这样,urllib.request.urlopen() 返回的是字节流,所以 re 不知道该用什么编码。那么在这种情况下我该怎么办呢?有没有办法在 url 请求中指定编码方式,还是我需要自己重新编码字符串?如果是这样,我应该怎么做呢?我想我应该从头部信息中读取编码,或者如果 HTML 中指定了编码类型,然后再把它重新编码成那个格式?

7 个回答

11

我这两天也遇到了同样的问题。最后我找到了解决办法。
我使用了从 urlopen() 返回的对象的 info() 方法:

req=urllib.request.urlopen(URL)
charset=req.info().get_content_charset()
content=req.read().decode(charset)
116

对我来说,解决方案如下(使用python3):

resource = urllib.request.urlopen(an_url)
content =  resource.read().decode(resource.headers.get_content_charset())
66

你只需要解码响应内容,通常可以通过查看最后一个值的 Content-Type 头来完成。这里面有个例子,可以在这个教程里找到。

output = response.decode('utf-8')

撰写回答