今天我们来学习怎么从网络上抓取我们想得到的信息,要从网页上得到我们的信息,首先是从网络上通过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. HTML5一些元素的整理

    address元素: 定义和用法 <address> 标签定义文档或文章的作者/拥有者的联系信息. 如果 <address> 元素位于 <body> 元素内,则它表 ...

  2. 新手编译开发OpenWrt入门教程(自定义固件、ubuntu学习)

    转自:   http://www.znck007.com/forum.php?mod=viewthread&tid=21571 由于openwrt编译教程资料很多,不同的cpu芯片只需要选择对 ...

  3. 第四章 Javac编译原理(待续)

    Javac是什么 Javac编译器的基本结构 Javac工作原理分析 设计模式解析之访问者模式

  4. Java中自定义枚举(Enum)项的值,可设置为指定的值

    一.代码 package base.lang; /** * ClassName: StateEnum  * @Description: TODO * @author fuming * @date 20 ...

  5. ReactNative http网络通讯

    安装 fetch npm install whatwg-fetch --save 1.fetch的Get方式通讯 async sendGet(){ let response = await fetch ...

  6. GUI编程02

    1 编写一个导航栏 from tkinter import * root = Tk() root.title("测试") root.geometry("400x400+4 ...

  7. 关于c#运算符的简单应用。。。

    按套路,先罗列一下各种运算符. 运算符的分类: 算数: +-*/(加减乘除)%(取余,就是除不尽剩下的,77/10就余7),++(加加)--(减减) 关系:>  <  >=  < ...

  8. python pip ez_setup.py

    #!/usr/bin/env python """Bootstrap setuptools installation To use setuptools in your ...

  9. ROS Learning-014 learning_tf(编程) 坐标系变换(tf)广播员 (Python版)

    ROS Indigo learning_tf-01 坐标系变换(tf)广播员 (Python版) 我使用的虚拟机软件:VMware Workstation 11 使用的Ubuntu系统:Ubuntu ...

  10. Linux tee命令

    一.简介 tee以标准输入作为输入,标准输出和文件作为输出.   二.语法 Usage: tee [OPTION]... [FILE]... Copy standard input to each F ...