我目前正在尝试学习如何从网页上阅读,并尝试了以下内容:
>>>import urllib.request
>>>page = urllib.request.urlopen("http://docs.python-requests.org/en/latest/", data = None)
>>>contents = page.read()
>>>lines = contents.split('\n')
这会出现以下错误:
Traceback (most recent call last):
File "<pyshell#4>", line 1, in <module>
lines = contents.split('\n')
TypeError: Type str doesn't support the buffer API
现在我假设读取URL与读取文本文件非常相似,contents
的内容类型为str
。这不是那种情况吗?
当我尝试>>> contents
时,我可以看到contents
的内容只是HTML文档,为什么`.split('\ n')不起作用?我怎样才能使它发挥作用?
请注意我在换行字符处拆分,以便我可以逐行打印网页。
按照同样的思路,然后我尝试contents.readlines()
,这给出了这个错误:
Traceback (most recent call last):
File "<pyshell#8>", line 1, in <module>
contents.readlines()
AttributeError: 'bytes' object has no attribute 'readlines'
网页是否存储在名为“bytes”的对象中?
有人可以向我解释这里发生了什么吗?以及如何正确阅读网页?
答案 0 :(得分:3)
您需要使用io.TextIOWrapper()
对象对其进行包装并对文件进行编码(utf-8
是通用的,您可以将其更改为正确的编码):
import urllib.request
import io
u = urllib.request.urlopen("http://docs.python-requests.org/en/latest/", data = None)
f = io.TextIOWrapper(u,encoding='utf-8')
text = f.read()
答案 1 :(得分:1)
解码bytes对象以生成字符串:
lines = contents.decode(encoding="UTF-8").split("/n")
答案 2 :(得分:0)
read()
方法的返回类型属于bytes
类型。在使用split
之类的字符串方法之前,需要将其正确解码为字符串。假设它是UTF-8,您可以使用:
s = contents.decode('utf-8')
lines = s.split('\n')
作为一般解决方案,您应该检查服务器在您的请求的响应中提供的字符编码并使用它。