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

posted @ 2016-07-15 14:32  Blue眼泪2016  阅读(254)  评论(0编辑  收藏  举报