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解析网页的内容