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

1、爬取title标签的内容

采用的正则表达式为'(.*?)',(.*?)就代表我们爬取的内容,以爬取百度首页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]

爬取结果:
正则表达式爬取网页数据学习笔记_第1张图片
注意:上面输出的汉字出现乱码的情况,现对输出的解析方式做出更改
正则表达式爬取网页数据学习笔记_第2张图片
源码如下:

# -*- 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')#进行转码

更改后输出结果如下:
正则表达式爬取网页数据学习笔记_第3张图片

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

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

<a href="网页链接">a>

HTML中超链接的完整结构为:
正则表达式爬取网页数据学习笔记_第4张图片
(1)获取完整的超链接:

# -*- 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""

所使用的正则表达式,符号间不能有空格符,建议在开发中,把使用的正则表达式单独列出来,方便查看与后续的更改。
运行结果:
正则表达式爬取网页数据学习笔记_第5张图片
(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):支持点任意匹配模式

运行结果:
正则表达式爬取网页数据学习笔记_第6张图片

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

网页中常用的布局包括table布局或div布局,其中table表格布局中常见的标签包括tr、th和td,表格行为tr(table row),表格数据为td(table data),表格表头th(table heading)。那么如何抓取这些标签之间的内容呢?大多数的网页表格的数据都是通过JS加载的,如贵州财经大学的招生网信息,我们先不对JS加载的数据进行就了解,先来学习一下爬取纯HTML的表格的内容。
正则表达式爬取网页数据学习笔记_第7张图片
预设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>

运行结果:
正则表达式爬取网页数据学习笔记_第8张图片
(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的内容标签不在其中输出
运行输出结果:
正则表达式爬取网页数据学习笔记_第9张图片
注意:如果输出的中文出现乱码现象,请把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]

运行结果:
正则表达式爬取网页数据学习笔记_第10张图片
心得:
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)

运行结果:
正则表达式爬取网页数据学习笔记_第11张图片

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

运行结果:
正则表达式爬取网页数据学习笔记_第12张图片
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 = '''user'''
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]为倒数第二个字符串
运行结果如下:
正则表达式爬取网页数据学习笔记_第13张图片

你可能感兴趣的:(Python学习,正则表达式,爬取网页,学习笔记)

(.*?)(.*?)(.*?)(.*?)(.*?)(.*?)(.*?)(.*?)(.*?)(.*?)(.*?)
杨 友良好
杨金虎及 格
杨绍伟优秀
(.*?)(.*?)