如何处理urllib.request.urlopen()的响应编码,以避免TypeError: can't use a string pattern on a bytes-like object
我正在尝试使用 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')