如何在Python 3中从URL读取HTML
我看了之前类似的问题,结果更加困惑了。
在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 个回答
用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的文档和教程都很不错,我建议你可以作为参考,因为它能解答你可能遇到的大部分问题。
import requests
url = requests.get("http://yahoo.com")
htmltext = url.text
print(htmltext)
这段代码的功能和 urllib.urlopen
很像。
urllib.request.urlopen(url).read()
这段代码应该会给你返回一个原始的HTML网页内容,形式是一个字符串。
试试'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/
请注意,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)