赞
踩
采用的正则表达式为'<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')#进行转码
更改后输出结果如下:
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):支持点任意匹配模式
运行结果:
网页中常用的布局包括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>杨 友</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(' ', '') #把出现的<br />和 替换成空 value1 = m[1].replace('<br />', '').replace(' ', '') 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.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]为倒数第二个字符串
运行结果如下:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。