采用的正则表达式为'
就代表我们爬取的内容,以爬取百度首页title为例;
爬取百度标题代码如下:
# -*- coding: utf-8 -*-
import re
import urllib
url = "http://www.baidu.com"
content = urllib.urlopen(url).read()
title = re.findall(r'(.*?) ',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'(.*?) ',content)
for t in title:
print unicode(t,'utf-8')#进行转码
HTML中超链接的基本结构为:
<a href="网页链接">a>
# -*- coding: utf-8 -*-
import re
import urllib
url = "http://www.baidu.com/"
content = urllib.urlopen(url).read()
#获取完整的超链接
res = r""
urls = re.findall(res, content)
for i in urls:
print unicode(i,'utf-8')
注意:
res = r""
所使用的正则表达式,符号间不能有空格符,建议在开发中,把使用的正则表达式单独列出来,方便查看与后续的更改。
运行结果:
(2)获取超链接里面的内容
# -*- coding: utf-8 -*-
import re
import urllib
url = "http://www.baidu.com/"
content = urllib.urlopen(url).read()
#获取超链接里面的内容
res = r'(.*?)'
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源码如下:
<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>532td><td>455td><td>379td><td>379td><td class="w210">本科二批td>
tr>
<tr>
<td>556td><td>523td><td>491td><td>484td><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'') #爬取网页的起点,标签包含在其中
end =content.find(r'
') #爬取网页的终点,标签不包含在其中 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'') #爬取网页的起点,标签包含在其中
end =content.find(r'') #爬取网页的终点,标签不包含在其中
result = unicode(content[star:end],'utf-8')
#获取 间的内容
res = r'(.*?) '
texts = re.findall(res,result,re.M|re.S)
for r in texts:
print u' 间的内容:',r
#获取 间的内容
for r in texts:
res_th = r'(.*?) '
text_th = re.findall(res_th,result,re.M|re.S)
for t in text_th:
print u' 间的内容:',t
print '================================================================================='
#横排输出 间的内容
res_th1 = r'(.*?) (.*?) (.*?) (.*?) (.*?) '
text_th1 = re.findall(res_th1,result,re.M|re.S)
for th1 in text_th1:
print u' 间的内容:',th1[0],th1[1],th1[2],th1[3],th1[4]
#获取 间的内容
res_td = r'(.*?) (.*?) (.*?) (.*?) (.*?) '
text_td = re.findall(res_td,result,re.M|re.S)
for d in text_td:
print u' 间的内容:',d[0],d[1],d[2],d[3],d[4]
运行结果:
心得:
1)为了避免我们获取的源码冗余,先进行片段截取。
2)对于我们所需要的正则表达式,可以先把我们需要的内容片段复制过来,用(.*?)直接进行替换,避免正则表达式代码出错。
3)多标签内的内容,需要循环输出
(3)字符串处理及替换
# -*- coding: utf-8 -*-
import re
content = '''
杨 友 良好
杨金虎 及 格
杨绍伟 优秀
'''
#表格内容处理前
res = r'(.*?) (.*?) '
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('
', '').replace(' ', '') #把出现的
和 替换成空
value1 = m[1].replace('
', '').replace(' ', '')
if '' in value1:
m_value = re.findall(r'(.*?)', value1, re.S|re.M)#用正则表达式匹配中的值
print (value0, m_value[0])
else:
print (value0, value1)
4、爬取标签中的参数
4.1、爬取超链接标签的URL
# -*- coding: utf-8 -*-
import re
content = '''
新闻
hao123
地图
视频
'''
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 = ''''''
urls = re.findall('src="(.*?)"', content, re.I|re.S|re.M)
print urls
运行结果:
4.3获取URL中的参数
通过split(’/’)来截取字符,采用字符“/”分割字符串,获取临近的字符
# -*- coding: utf-8 -*-
import re
#提取图片链接
content = ''''''
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]为倒数第二个字符串
运行结果如下:
你可能感兴趣的:(Python学习,正则表达式,爬取网页,学习笔记)