如何在Python 3中从URL读取HTML

100 投票
7 回答
280277 浏览
提问于 2025-04-18 09:22

我看了之前类似的问题,结果更加困惑了。

在Python 3.4中,我想根据网址读取一个HTML页面,并把它当作字符串使用。

在Perl中,我用LWP::Simple这个库,通过get()来实现这个功能。

一个关于matplotlib 1.3.1的例子提到:import urllib; u1=urllib.urlretrieve(url)

但是在Python 3中找不到urlretrieve这个方法。

我试了u1 = urllib.request.urlopen(url),这似乎得到了一个HTTPResponse对象,但我无法打印它,也不能获取它的长度或索引。

u1.body这个属性不存在。我找不到关于Python 3中HTTPResponse的描述。

HTTPResponse对象中有没有什么属性可以让我获取HTML页面的原始字节数据呢?

(其他问题中提到的urllib2在我的Python中不存在,还有CSV解析器等等,这些都不相关。)

编辑:

我在之前的问题中找到了一些东西,部分(大部分)解决了我的问题:

u2 = urllib.request.urlopen('http://finance.yahoo.com/q?s=aapl&ql=1')

for lines in u2.readlines():
    print (lines)

我说是“部分”是因为我不想逐行读取,而是想要一个完整的大字符串。

我可以把这些行连接起来,但每行打印出来前面都有一个字符'b'。

这个'b'是从哪里来的呢?

我想我可以在连接之前删除第一个字符,但这样做有点麻烦。

7 个回答

13

用urllib读取一个html页面其实很简单。既然你想把它作为一个整体字符串来读取,我来给你演示一下。

首先,导入urllib.request:

#!/usr/bin/python3.5

import urllib.request

接下来,准备我们的请求:

request = urllib.request.Request('http://www.w3schools.com')

在请求网页时,最好使用“try/except”来处理可能出现的问题,因为事情很容易出错。urlopen()就是用来请求网页的。

try:
    response = urllib.request.urlopen(request)
except:
    print("something wrong")

type是一个很有用的函数,可以告诉我们一个变量是什么“类型”。在这里,response是一个http.response对象。

print(type(response))

我们的response对象有一个read函数,可以把html内容以字节的形式存储到我们的变量中。再次使用type()可以验证这一点。

htmlBytes = response.read()

print(type(htmlBytes))

现在,我们用decode函数把字节变量转换成一个完整的字符串。

htmlStr = htmlBytes.decode("utf8")

print(type(htmlStr))

如果你想把这个字符串分成多行,可以使用split()函数。这样我们就可以轻松地遍历每一行,打印出整个页面或者进行其他处理。

htmlSplit = htmlStr.split('\n')

print(type(htmlSplit))

for line in htmlSplit:
    print(line)

希望这能提供更详细的解答。Python的文档和教程都很不错,我建议你可以作为参考,因为它能解答你可能遇到的大部分问题。

15
import requests

url = requests.get("http://yahoo.com")
htmltext = url.text
print(htmltext)

这段代码的功能和 urllib.urlopen 很像。

17

urllib.request.urlopen(url).read() 这段代码应该会给你返回一个原始的HTML网页内容,形式是一个字符串。

119

试试'requests'模块,它简单多了。

#pip install requests for installation

import requests

url = 'https://www.google.com/'
r = requests.get(url)
r.text

更多信息请点击这里 > http://docs.python-requests.org/en/master/

126

请注意,Python3 读取 HTML 代码时,不是把它当作字符串来处理,而是把它当作一个 bytearray(字节数组)。所以你需要用 decode 方法把它转换成字符串。

import urllib.request

fp = urllib.request.urlopen("http://www.python.org")
mybytes = fp.read()

mystr = mybytes.decode("utf8")
fp.close()

print(mystr)

撰写回答