正则表达式爬取网页数据学习笔记

1、爬取title标签的内容

采用的正则表达式为'<title>(.*?)</title>',(.*?)就代表我们爬取的内容,以爬取百度首页title为例;
在这里插入图片描述
爬取百度标题代码如下:

# -*- coding: utf-8 -*- 
import re
import urllib

url = "http://www.baidu.com"
content = urllib.urlopen(url).read()
title = re.findall(r'<title>(.*?)</title>',content)
print title[0]

爬取结果:
在这里插入图片描述
注意:上面输出的汉字出现乱码的情况,现对输出的解析方式做出更改
在这里插入图片描述
源码如下:

# -*- coding: utf-8 -*- 
import re
import urllib

url = "http://www.baidu.com"
content = urllib.urlopen(url).read()
title = re.findall(r'<title>(.*?)</title>',content)
for t in title:
    print unicode(t,'utf-8')#进行转码

更改后输出结果如下:
在这里插入图片描述

2、爬取超链接标签间的内容

HTML中超链接的基本结构为:

<a href="网页链接"></a>
<!--
 eg:
    <a href="http://www.ayouleyang.cn/">阿优乐扬</a> 
-->

HTML中超链接的完整结构为:
在这里插入图片描述
(1)获取完整的超链接:

# -*- coding: utf-8 -*-
import re
import urllib

url = "http://www.baidu.com/"
content = urllib.urlopen(url).read()

#获取完整的超链接
res = r"<a.*?href=.*?<\/a>"
urls = re.findall(res, content)
for i in urls:
    print unicode(i,'utf-8')

注意:

res = r"<a.*?href=.*?<\/a>"

所使用的正则表达式,符号间不能有空格符,建议在开发中,把使用的正则表达式单独列出来,方便查看与后续的更改。
运行结果:
只显示了一部分运行结果
(2)获取超链接里面的内容

# -*- coding: utf-8 -*-
import re
import urllib

url = "http://www.baidu.com/"
content = urllib.urlopen(url).read()

#获取超链接<a></a>里面的内容
res = r'<a.*?>(.*?)</a>'
urls = re.findall(res, content,re.S|re.M)
for t in urls:
    print unicode(t,'utf-8')

re.M(re.MULTILINE):允许多行模式
re.S(re.DOTALL):支持点任意匹配模式

运行结果:
在这里插入图片描述

3、爬取HTML表格(tr标签和td标签)间的内容

网页中常用的布局包括table布局或div布局,其中table表格布局中常见的标签包括tr、th和td,表格行为tr(table row),表格数据为td(table data),表格表头th(table heading)。那么如何抓取这些标签之间的内容呢?大多数的网页表格的数据都是通过JS加载的,如贵州财经大学的招生网信息,我们先不对JS加载的数据进行就了解,先来学习一下爬取纯HTML的表格的内容。
在这里插入图片描述
预设HTML源码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>贵州财经大学2018年理科各省分数线</title>
</head>
<body>
    <table border="1">
            <thead>
                <tr><th>最高分</th><th>平均分</th><th>最低分</th><th>省控线</th><th>录取批次</th></tr>
            </thead>
                <tbody>
                    <tr>
                        <td>532</td><td>455</td><td>379</td><td>379</td><td class="w210">本科二批</td>
                    </tr>
                    <tr>
                        <td>556</td><td>523</td><td>491</td><td>484</td><td class="w210">本科一批</td>
                    </tr>
                </tbody>
    </table>   
</body>
</html>

运行结果:
在这里插入图片描述
(1)截取部分源代码
在我们只需要网页中的一部分代码来进行分析时,我们可以取特定的部分进行爬取,提高分析的效率

# -*- coding: utf-8 -*-
import re
import urllib
url = "file:///G:/gufe.html" #本地预存的网页
content = urllib.urlopen(url).read()
star = content.find(r'<table border="1">') #爬取网页的起点,标签包含在其中
end =content.find(r'</body>') #爬取网页的终点,标签不包含在其中
print content[star:end]

注意:star的内容标签在其中,end的内容标签不在其中输出
运行输出结果:
在这里插入图片描述
注意:如果输出的中文出现乱码现象,请把print content[star:end]改为对应的编码方式输出,如utf-8:

print unicode(content[star:end],'utf-8')

(2)获取tr,th,td间的内容

# -*- coding: utf-8 -*-
import re
import urllib
url = "file:///G:/gufe.html" #本地预存的网页
content = urllib.urlopen(url).read()
star = content.find(r'<table border="1">') #爬取网页的起点,标签包含在其中
end =content.find(r'</body>') #爬取网页的终点,标签不包含在其中
result = unicode(content[star:end],'utf-8')

#获取<tr></tr>间的内容
res = r'<tr>(.*?)</tr>'
texts = re.findall(res,result,re.M|re.S)
for r in texts:
    print u'<tr></tr>间的内容:',r

#获取<th></th>间的内容
for r in texts:
    res_th = r'<th>(.*?)</th>'
    text_th = re.findall(res_th,result,re.M|re.S)
    for t in text_th:
        print u'<th></th>间的内容:',t
print '================================================================================='    

#横排输出<th></th>间的内容
res_th1 = r'<th>(.*?)</th><th>(.*?)</th><th>(.*?)</th><th>(.*?)</th><th>(.*?)</th>'
text_th1 = re.findall(res_th1,result,re.M|re.S)
for th1 in text_th1:
    print u'<th></th>间的内容:',th1[0],th1[1],th1[2],th1[3],th1[4]

#获取<td></td>间的内容       
res_td = r'<td>(.*?)</td><td>(.*?)</td><td>(.*?)</td><td>(.*?)</td><td class="w210">(.*?)</td>'
text_td = re.findall(res_td,result,re.M|re.S)
for d in text_td:
    print u'<td></td>间的内容:',d[0],d[1],d[2],d[3],d[4]

运行结果:
在这里插入图片描述
心得:
1)为了避免我们获取的源码冗余,先进行片段截取。
2)对于我们所需要的正则表达式,可以先把我们需要的内容片段复制过来,用(.*?)直接进行替换,避免正则表达式代码出错。
3)多标签内的内容,需要循环输出

(3)字符串处理及替换

# -*- coding: utf-8 -*-
import re
 
content = '''
<tr><td>杨&nbsp;友</td><td>良好<br /></td></tr>
<tr><td>杨金虎</td><td>及 格</td></tr>
<tr><td>杨绍伟</td><td><B>优秀</B></td></tr>
'''
#表格内容处理前
res = r'<tr><td>(.*?)</td><td>(.*?)</td></tr>'    
texts = re.findall(res, content, re.S|re.M|re.I)
print ("===========表格内容处理前============")
for m in texts:
    print (m[0],m[1])

#表格内容处理后
print ("===========表格内容处理后============")
for m in texts:
    value0 = m[0].replace('<br />', '').replace('&nbsp;', '') #把出现的<br />和&nbsp;替换成空
    value1 = m[1].replace('<br />', '').replace('&nbsp;', '')
    if '<B>' in  value1:
        m_value = re.findall(r'<B>(.*?)</B>', value1, re.S|re.M)#用正则表达式匹配<B></B>中的值
        print (value0, m_value[0])
    else:
        print (value0, value1)

运行结果:
在这里插入图片描述

4、爬取标签中的参数

4.1、爬取超链接标签的URL

# -*- coding: utf-8 -*-
import re
 
content = '''
<a href="http://news.baidu.com" name="tj_trnews" class="mnav">新闻</a>
<a href="http://www.hao123.com" name="tj_trhao123" class="mnav">hao123</a>
<a href="http://map.baidu.com" name="tj_trmap" class="mnav">地图</a>
<a href="http://v.baidu.com" name="tj_trvideo" class="mnav">视频</a>
'''
 
res = r"(?<=href=\").+?(?=\")|(?<=href=\').+?(?=\')"
urls = re.findall(res, content, re.I|re.S|re.M)
for url in urls:
    print url

运行结果:
在这里插入图片描述
4.2、爬取图片超链接标签的URL
在这里插入图片描述
以获取百度logo的URL链接地址为例,图片的HTML链接地址基本结构为:
(1)包含域名

<img src="域名/文件夹/图片名称.图片格式" alt="图片的描述">

(2)不包含域名

<img src="/文件夹/图片名称.图片格式" alt="图片的描述">

百度的logo链接包含域名,不需要我们对域名和路径进行拼接,便于直接获取URL链接地址
获取链接源码如下:

import re
content = '''<img id="s_lg_img_new" class="s_lg_img_gold_showre" src="https://ss0.bdstatic.com/5aV1bjqh_Q23odCf/static/superman/img/logo/logo_white_fe6da1ec.png" width="270" height="129" usemap="#mp" title="" cursor="default">'''
urls = re.findall('src="(.*?)"', content, re.I|re.S|re.M)
print urls

运行结果:
在这里插入图片描述
4.3获取URL中的参数
通过split(’/’)来截取字符,采用字符“/”分割字符串,获取临近的字符

# -*- coding: utf-8 -*-
import re

#提取图片链接
content = '''<img alt="user" src="https://ayouleyang.cn/images/yangyou.png">'''
urls = re.findall('src="(.*?)"', content, re.I|re.S|re.M)
url = urls[0]
print u"图片链接:",url

#通过split截取字符
name = url.split('/')[-1]
print u'输出图片名字:',name

name1 = url.split('/')[-2]
print u'输出图片文件夹:',name1

心得: url.split(’/’)[-1] 表示以“/”分割,[-1]为倒数第一个字符串,[-2]为倒数第二个字符串
运行结果如下:
在这里插入图片描述

  • 0
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值