Python学习过程(三)
今天我们来学习怎么从网络上抓取我们想得到的信息,要从网页上得到我们的信息,首先是从网络上通过url获取页面
的文本,先从最简单的开始,比如获取百度首页的html。
对应代码如下:
获取网页html源码(1)
import urllib2
import re
#定义一个通过url获取页面的函数
def getHtml(url):
response = urllib2.urlopen(url)
print response.read() getHtml("http://www.baidu.com")
我们还可以对这个函数进行细化:函数此时有返回值,返回的是我们的html源码
获取网页html源码(2)
import urllib2
import re
#定义一个通过url获取页面的函数,返回html源码
def getHtml(url):
request = urllib2.Request(url)
response = urllib2.urlopen(request)
html = response.read()
return html s = getHtml("http://www.baidu.com")
print s
获取到了我们需要的网页,接下来就是要把我们的网页保存到本地,代码如下,路径默认存放在D盘下的
PthonHtml文件夹下,保存的名称可以由我们传入参数进行设置
下载网页html源码到本地
import urllib2
import re
#定义一个通过url获取页面的函数,返回html源码
def getHtml(url,name):
request = urllib2.Request(url)
response = urllib2.urlopen(request)
html = response.read()
fileobject = open("D://PythonHtml//"+name+".html","w") #w代表写入
fileobject.write(html)
fileobject.close() getHtml("http://www.baidu.com","baidu")
这样我们就把网页下载到我们的本地文件夹下了,当然也可以不用下载,直接在线操作html也可以获取信息。
如果需要打开我们的文件的时候,可以这么写:
打开本地网页html源码
import urllib2
import re
#定义一个通过url获取页面的函数,返回html源码
def getHtml(url,name):
request = urllib2.Request(url)
response = urllib2.urlopen(request)
html = response.read()
fileobject = open("D://PythonHtml//"+name+".html","w") #w代表写入
fileobject.write(html)
fileobject.close()
#打开文件
def openHtml():
fileobject = open("D://PythonHtml//baidu.html","r")
html = fileobject.read()
print html openHtml()
接下来,就是我们需要去解析网了,有了我们的网页后,就可以提取里面的内容了,比如说现在我要获取网页中的a标签的内容
为了方便,我先用一段写好的网页代码做测试,在从网上获取html运行
解析html源码a标签的文本
import urllib2
import re
#获取a标签的文本
def getAlable():
html = """
<html>
<head></head>
<body>
<div>
<p>Hello</p>
<p><a href="http://www.baidu.com">我是a标签文本</a></p>
<a href="http://www.hao123.com">我也a标签</a>
</div>
</body>
</html>
"""
text = []
txts = re.findall(r"<a.*?>(.*?)<\/a>",html,re.I|re.S|re.M)
for i in txts:
text.append(i)
return text
s = getAlable()
for x in s:
print x
运行结果如下:

那么我们就可以写出一个函数,专门用来获取网页中a标签的文本了:
import urllib2
import re
#获取a标签的文本
def getAlable(html):
text = []
txts = re.findall(r"<a.*?>(.*?)<\/a>",html,re.I|re.S|re.M)
for i in txts:
text.append(i)
return text
获取了a标签的文本,我们同样也可以获取a标签的超链接url
解析html源码a标签的URL
def getAurl():
html = """
<html>
<head></head>
<body>
<div>
<p>Hello</p>
<p><a href="http://www.baidu.com">我是a标签文本</a></p>
<a href="http://www.hao123.com">我也a标签</a>
</div>
</body>
</html>
"""
url = []
txts = re.findall("(?<=href=\").+?(?=\")|(?<=href=\').+?(?=\')",html,re.I|re.S|re.M)
for i in txts:
print i
url.append(i)
return url getAurl()
运行结果:

那么有没有方法可以既可以获取文本,又可以获取url呢?
解析html源码a标签
def findLinks3():
html = '''
<html>
<head></head>
<body>
<div>
<p>Hello</p>
<p><a href="http://www.baidu.com">我是a标签文本</a></p>
<a href="http://www.hao123.com">我也a标签</a>
</div>
</body>
</html>
'''
l = []
urls = re.findall(r"<a.*?href=.*?<\/a>",html,re.I|re.S|re.M)
for i in urls:
print i
l.append(i)
return l findLinks3()
运行结果:

是不是觉得不够清爽?我就想要 我是a标签文本 :http://www.baidu.com 这么清爽的有木有???当然可以咯,就是把我获取到的在进行调用两函数吗!,
解析html源码a标签的文本和超链接
def getAurl(html):
url = []
txts = re.findall("(?<=href=\").+?(?=\")|(?<=href=\').+?(?=\')",html,re.I|re.S|re.M)
for i in txts:
url.append(i)
return url[0] def findLinks3(html):
l = []
urls = re.findall(r"<a.*?href=.*?<\/a>",html,re.I|re.S|re.M)
for i in urls:
l.append(i)
return l def getTextUrl(html):
d = {}
l = findLinks3(html)
for i in l:
text = getAlable(i)
url = getAurl(i)
d[text] = url
print text,url
return d
html = """
<html>
<head></head>
<body>
<div>
<p>Hello</p>
<p><a href="http://www.baidu.com">我是a标签文本</a></p>
<a href="http://www.hao123.com">我也a标签</a>
</div>
</body>
</html>
"""
getTextUrl(html)
运行结果:

结果这些练习,有没有发现这些函数好像都有些相似的地方,唯一区别就在于re.findall("这里的内容就是正则表达式"),正式因为里面的内容不同,所以搜索字符串得到的
就大不一样,换句话说,得到的结果完全由里面的正则表达式来决定。
为此,正则表达式就是我们接下来的重中之重!!!
下一节: python解析网页的内容
Python学习过程(三)的更多相关文章
- 学习Python的三种境界
前言 王国维在<人间词话>中将读书分为了三种境界:"古今之成大事业.大学问者,必经过三种之境界:'昨夜西风凋碧树,独上高楼,望尽天涯路'.此第一境也.'衣带渐宽终不悔,为伊消得人 ...
- 孤荷凌寒自学python第三十九天python 的线程锁Lock
孤荷凌寒自学python第三十九天python的线程锁Lock (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 当多个线程同时操作一个文件等需要同时操作某一对象的情况发生时,很有可能发生冲突, ...
- 孤荷凌寒自学python第三十八天初识python的线程控制
孤荷凌寒自学python第三十八天初识python的线程控制 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 一.线程 在操作系统中存在着很多的可执行的应用程序,每个应用程序启动后,就可以看 ...
- 孤荷凌寒自学python第三十七天python的文件与内存变量之间的序列化与反序列化
孤荷凌寒自学python第三十七天python的文件与内存变量之间的序列化与反序列化 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 一.什么是序列化与反序列化 序列化是指将内存中的数据进行指 ...
- 孤荷凌寒自学python第三十五天python的文件操作之针对文件操作的os模块的相关内容
孤荷凌寒自学python第三十五天python的文件操作之针对文件操作的os模块的相关内容 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 一.打开文件后,要务必记得关闭,所以一般的写法应当 ...
- 孤荷凌寒自学python第三十四天python的文件操作对file类的对象学习
孤荷凌寒自学python第三十四天python的文件操作对file类的对象学习 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 一.close() 当一个file对象执行此方法时,将关闭当前 ...
- 孤荷凌寒自学python第三十三天python的文件操作初识
孤荷凌寒自学python第三十三天python的文件操作初识 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 今天开始自学python的普通 文件操作部分的内容. 一.python的文件打开 ...
- 孤荷凌寒自学python第三十一天python的datetime.timedelta模块
孤荷凌寒自学python第三十一天python的datetime.timedelta模块 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) datetime.timedelta模块是一个表示 ...
- 孤荷凌寒自学python第三十天python的datetime.datetime模块
孤荷凌寒自学python第三十天python的datetime.datetime模块 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) datetime.datetime模块包含了:datet ...
- 孤荷凌寒自学python第三天 初识序列
孤荷凌寒自学python第三天 初识序列 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) Python的序列非常让我着迷,之前学习的其它编程语言中没有非常特别关注过序列这种类型的对象,而pyt ...
随机推荐
- MySQL 学习四 SQL优化
MySQL逻辑架构: 第一层:客户端层,连接处理,授权认证,安全等功能. 第二层:核心层,查询解析,分析,优化,缓存,内置函数(时间,数学,加密),存储过程,触发器,视图 第三层:存储引擎.负 ...
- C字符串翻转
实现字符串翻转,思路很简单,就是首尾字符对调. void reverse(char* str){ char* p = str + strlen(str) - 1;//最后一个字符地址 char tem ...
- Python函数(八)-装饰器(一)
装饰器通过函数来定义,用来装饰函数 装饰器的结构为高阶函数和内嵌函数 装饰器不改变被装饰函数的源代码和运行方式 如何实现这个效果呢? # -*- coding:utf-8 -*- __author__ ...
- PL/SQL批处理语句(二)FORALL
PL/SQL批处理语句(二)FORALL 我们知道PL/SQL程序中运行SQL语句是存在开销的,因为SQL语句是要提交给SQL引擎处理,这种在PL/SQL引擎和SQL引擎之间的控制转移叫做上下文却换, ...
- C语言获取系统时间
localtime函数 #include <stdio.h> #include <time.h> int main () { time_t t; struct tm *lt; ...
- 关于taskaffinity属性的作用
意味着这activity更喜欢哪个TESK,具体见下方说明 当一个包含FLAG_ACTIVITY_NEW_TASK标志的intent启动一个activity时. 一个新的activity,默认地启动到 ...
- jquery datatable 多行(单行)选择(select),行获取/行删除
jquery datatable 多行(单行)选择(select),行获取/行删除 代码展示 // 示例数据源 var dataSet = [ ['Tasman','Internet Explorer ...
- day17 14.dao模式介绍
Web的三层架构,不是MVC,Web层,Service层,DAO层. 之前玩的JSP Servlet JavaBean那是MVC模式,那玩意只是表现层的东西. 转账汇款的例子. 说了这么多有啥用啊,一 ...
- oracle创建完实例删除的时候报ORA-01031:insufficient privileges错误,解决办法
创建了一个数据库,想删除确报了一个ORA-01031:insufficient privileges错误 查了好久,总算解决了,原因是我的电脑登录账户不在ORA_DBA系统群组中,添加进去完美删除! ...
- 在Linux里安装jdk
一.系统环境说明: [操作系统]:Ubuntu 18.04.1 Desktop [JDK]:jdk1.8.0_181,文件名称:jdk-8u181-linux-x64.tar 二.准备jdk文件 下载 ...