今天我们来学习怎么从网络上抓取我们想得到的信息,要从网页上得到我们的信息,首先是从网络上通过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学习过程(三)的更多相关文章

  1. 学习Python的三种境界

    前言 王国维在<人间词话>中将读书分为了三种境界:"古今之成大事业.大学问者,必经过三种之境界:'昨夜西风凋碧树,独上高楼,望尽天涯路'.此第一境也.'衣带渐宽终不悔,为伊消得人 ...

  2. 孤荷凌寒自学python第三十九天python 的线程锁Lock

    孤荷凌寒自学python第三十九天python的线程锁Lock (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 当多个线程同时操作一个文件等需要同时操作某一对象的情况发生时,很有可能发生冲突, ...

  3. 孤荷凌寒自学python第三十八天初识python的线程控制

     孤荷凌寒自学python第三十八天初识python的线程控制 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 一.线程 在操作系统中存在着很多的可执行的应用程序,每个应用程序启动后,就可以看 ...

  4. 孤荷凌寒自学python第三十七天python的文件与内存变量之间的序列化与反序列化

    孤荷凌寒自学python第三十七天python的文件与内存变量之间的序列化与反序列化 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 一.什么是序列化与反序列化 序列化是指将内存中的数据进行指 ...

  5. 孤荷凌寒自学python第三十五天python的文件操作之针对文件操作的os模块的相关内容

     孤荷凌寒自学python第三十五天python的文件操作之针对文件操作的os模块的相关内容 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 一.打开文件后,要务必记得关闭,所以一般的写法应当 ...

  6. 孤荷凌寒自学python第三十四天python的文件操作对file类的对象学习

     孤荷凌寒自学python第三十四天python的文件操作对file类的对象学习 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 一.close() 当一个file对象执行此方法时,将关闭当前 ...

  7. 孤荷凌寒自学python第三十三天python的文件操作初识

     孤荷凌寒自学python第三十三天python的文件操作初识 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 今天开始自学python的普通 文件操作部分的内容. 一.python的文件打开 ...

  8. 孤荷凌寒自学python第三十一天python的datetime.timedelta模块

     孤荷凌寒自学python第三十一天python的datetime.timedelta模块 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) datetime.timedelta模块是一个表示 ...

  9. 孤荷凌寒自学python第三十天python的datetime.datetime模块

     孤荷凌寒自学python第三十天python的datetime.datetime模块 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) datetime.datetime模块包含了:datet ...

  10. 孤荷凌寒自学python第三天 初识序列

    孤荷凌寒自学python第三天 初识序列 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) Python的序列非常让我着迷,之前学习的其它编程语言中没有非常特别关注过序列这种类型的对象,而pyt ...

随机推荐

  1. MFRC522模块开发笔记

    Write_to_Card(-)和Read_from_Card(-)可谓是所有函数的终点,而SPIWriteByte(-)则是最底层对MFRC522模块进行操作的函数,所有函数都是为了Write_to ...

  2. oracle错误-ORA-12519, TNS:no appropriate service handler found

    转自:https://blog.csdn.net/u013147600/article/details/48380841

  3. C++知识点总结(5)

    1.为何静态成员函数不能调用非静态成员函数 静态成员函数可以不需要类的实例就直接使用,非静态的成员函数很可能用到一些成员变量,而成员变量的创建和初始化是在创建了类的实例时在构造函数调用的时候才进行的. ...

  4. 如何设置Win10文件资源管理器默认打开“这台电脑”

    摘录自:http://www.ithome.com/html/win10/126066.htm

  5. springBoot 案例

    一.工具 JDK1.7 Eclipse Maven 这里Eclipse集成Maven的这一步就省了! 二.编码 新建Maven Project 命名为:SpringBootDemo 选项如图 2.修改 ...

  6. 7-n!末尾有几个0

    如何确定一个N!末尾有多少个零 转载 2015年08月30日 15:02:49 622 题目:1*2*3*……*100 求结果末尾有多少个零 分析:一般类似的题目都会蕴含某种规律或简便方法的,阶乘末尾 ...

  7. CMake 默认编译、链接选项

    查看cmake默认编译和链接的参数设置 CMakeLists.txt 文件内容: cmake_minimum_required(VERSION 3.2) message(STATUS "CM ...

  8. c++ 切勿重新定义继承来的带缺省参数的函数

    切勿重新定义继承来的带缺省参数的函数.我们知道,继承来的函数是virtual 的,至于原因在上一节中已经说明了,即“切勿重新定义父类non-virtual函数”.所以确切的描述应该是“切勿重新定义继承 ...

  9. CF609E Minimum spanning tree for each edge

    原来觉得是一个LCT,感觉自己瞬间傻掉…… 考虑到先做一个最小生成树求出做最小生成树的代价$ans$,顺便标记一下树边和非树边,把边按照输入$id$排序回去之后扫,如果扫到一条树边,那么此时的答案就是 ...

  10. Luogu 3402 可持久化并查集

    点开这题纯属无聊……不过既然写掉了,那就丢一个模板好了 不得不说,可持久化并查集实现真的很暴力,就是把并查集的数组弄一个主席树可持久化. 有一点要注意的是不能写路径压缩,这样跳版本的时候会错,所以弄一 ...