Python 3.4 - 从网页读取数据

时间:2014-11-27 06:05:39

标签: python html url python-3.x webpage

我目前正在尝试学习如何从网页上阅读,并尝试了以下内容:

>>>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”的对象中?

有人可以向我解释这里发生了什么吗?以及如何正确阅读网页?

3 个答案:

答案 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')

作为一般解决方案,您应该检查服务器在您的请求的响应中提供的字符编码并使用它。