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 ...
随机推荐
- 第八课 go的条件语句
1 if ... else package main import "fmt" func main() { flag:= { fmt.Println("flag > ...
- 数据库:ubantu下MySQL数据库备份方法
1.编辑/etc/crontab文件设定定时任务,在制定时间执行backup_databases.sh vi /etc/crontab # /etc/crontab: system-wide cron ...
- 2015.11.3 RichBox改变若干文本颜色
for(int i=1;i<rtb.Lines.Length;i++) { if(rtb.Lines[i] == rtb.Lines[i - 1]) { int bg = rtb.GetFirs ...
- suse 源的添加与删除,以及源地址
地址 一个是上海交大的,http://ftp.sjtu.edu.cn/opensuse/update/ 葡萄牙的: http://ftp.nux.ipb.pt/pub/dists/opensuse/u ...
- JS获取页面URL信息
下面我们举例一个URL,然后获得它的各个组成部分: http://i.cnblogs.com/EditPosts.aspx?opt=1 window.location.href (设置或获取整个 UR ...
- 第三天:Servlet运行原理
1. 如何不重启tomcat就可以重新加载一个web应用?? 方法:进入tomcat的manager之后点击reload即可. 2.开发一个Servlet,该Servlet可以输出自己的名字并显示当 ...
- tortoisesvn 本项目的忽略项
https://tortoisesvn.net/docs/release/TortoiseSVN_en/tsvn-dug-propertypage.html Adding and Editing Pr ...
- springboot启动过程(2)-run方法
1 springApplication的run run方法主要是用于创造spring容器ConfigurableApplicationContext对象. public ConfigurableApp ...
- Java线程池拒绝策略
Java线程池拒绝策略 相关资料: 线程池的RejectedExecutionHandler(拒绝策略):http://blog.csdn.net/jgteng/article/details/544 ...
- 用StringBuilder来实现经典的反转问题
import java.util.Scanner; public class Practise03 { public static void main(String[] args) { //键盘录入一 ...