Python爬虫基础之正则表达式
一、Python正则表达式的基本使用
Python 3 使用re模块可以实现大部分的正则表达式情况。
1.re.compile(pattern, flags=0)
re.compile构建匹配规则并返回一个正则表达式对象,这样的好处就是可以多次使用这个匹配规则,通过调用它的match()和search()方法或作为re.match和re.search的pattern参数来匹配字符串。
html_doc = "www.cnblogs.com"
pattern = re.compile('www') # 实例化pattern 对象
match = re.match(pattern,html_doc) # 或者 match = pattern.match(html_doc) if match: # www不在字符串开始位置,匹配成功
print(match.group(0))
else:
print("not match com") # 打印
# www
2.re.match(pattern, string, flags=0)
re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none。
匹配成功re.match方法返回一个匹配的对象,否则返回None。
我们可以使用group(num) 或 groups() 匹配对象函数来获取匹配表达式。
html_doc = "www.cnblogs.com"
if re.match("www", html_doc): # www在字符串开始位置,匹配成功
print(re.match("www", html_doc).group(0))
else:
print("not match www") if re.match("com", html_doc): # com不在字符串开始位置,匹配失败
print(re.match("com", html_doc).group(0))
else:
print("not match com") # 打印
# www
# not match com
3.re.search(pattern, string, flags=0)
re.search 扫描整个字符串并返回第一个成功的匹配。
匹配成功re.search方法返回一个匹配的对象,否则返回None。
我们可以使用group(num) 或 groups() 匹配对象函数来获取匹配表达式。
html_doc = "www.cnblogs.com"
if re.search("www", html_doc): # www在字符串开始位置,匹配成功
print(re.search("www", html_doc).group(0))
else:
print("not match www") if re.search("com", html_doc): # com不在字符串开始位置,匹配成功
print(re.search("com", html_doc).group(0))
else:
print("not match com") # 打印
# www
# com
4.re.sub(pattern, repl, string, count=0)
re.sub用于替换字符串中的匹配项。
repl : 替换的字符串,也可为一个函数;string : 要被查找替换的原始字符串;count : 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。
html_doc = "http://www.cnblogs.com"
pattern = re.compile('http') # 实例化pattern 对象
html_doc_after_sub = re.sub(pattern, "https", html_doc)
print(html_doc_after_sub) # 打印
# https://www.cnblogs.com
5.re.findall(pattern, string, flags=0)
re.findall查找所有满足pattern匹配规则的字符串,而不像re.match和re.search找到一个满足匹配规则的字符串就直接返回。
html_doc = "He was carefully disguised but captured quickly by police."
pattern = re.compile(r'\w+ly') # 查找所有以ly结尾的单词
results = re.findall(pattern, html_doc)
print(results) # 打印
# ['carefully', 'quickly']
二、Python正则表达式的实际应用
<ul class="m-cvrlst f-cb" id="m-pl-container">
<li>
<div class="u-cover u-cover-1">
<img class="j-flag" src="http://p1.music.126.net/FGe-rVrHlBTbnOvhMR99PQ==/109951162989189558.jpg?param=140y140" />
<a title="【说唱】留住你一面,画在我心间" href="/playlist?id=832790627" class="msk"></a>
<div class="bottom">
<a class="icon-play f-fr" title="播放" href="javascript:;" data-res-type="13" data-res-id="832790627" data-res-action="play"></a>
<span class="icon-headset"></span>
<span class="nb">1615</span>
</div>
</div> <p class="dec"> <a title="【说唱】留住你一面,画在我心间" href="/playlist?id=832790627" class="tit f-thide s-fc0">【说唱】留住你一面,画在我心间</a> </p> <p><span class="s-fc4">by</span> <a title="JediMindTricks" href="/user/home?id=17647877" class="nm nm-icn f-thide s-fc3">JediMindTricks</a> <sup class="u-icn u-icn-84 "></sup> </p> </li>
<li>
<div class="u-cover u-cover-1">
<img class="j-flag" src="http://p1.music.126.net/If644P7ZrfPm_qcvtYyfzg==/18936888765458653.jpg?param=140y140" />
<a title="鞋子好看|国产自赏摇滚噪音流行" href="/playlist?id=721462105" class="msk"></a>
<div class="bottom">
<a class="icon-play f-fr" title="播放" href="javascript:;" data-res-type="13" data-res-id="721462105" data-res-action="play"></a>
<span class="icon-headset"></span>
<span class="nb">77652</span>
</div>
</div> <p class="dec"> <a title="鞋子好看|国产自赏摇滚噪音流行" href="/playlist?id=721462105" class="tit f-thide s-fc0">鞋子好看|国产自赏摇滚噪音流行</a> </p> <p><span class="s-fc4">by</span> <a title="原创君" href="/user/home?id=201586" class="nm nm-icn f-thide s-fc3">原创君</a> <sup class="u-icn u-icn-1 "></sup> </p> </li>
</ul>
开始解析html源码
首先实例化一个正则表达式pattern对象,匹配规则r'<img class="j-flag" src="(.*?)" />',通过re.findall匹配到所有的img标签的src属性,保存在列表results_img_url中.再通过re.findall匹配到所有满足匹配规则r'<a title="(.*?)" href="(.*?)" class="msk"></a>'的按标签,
并提取属性title和href,保存在元祖中。
import re pattern_img = re.compile(r'<img class="j-flag" src="(.*?)" />')
results_img_url = re.findall(pattern_img,html_doc)
print(results_img_url)
# 打印 ['http://p1.music.126.net/FGe-rVrHlBTbnOvhMR99PQ==/109951162989189558.jpg?param=140y140', 'http://p1.music.126.net/If644P7ZrfPm_qcvtYyfzg==/18936888765458653.jpg?param=140y140']
pattern_a = re.compile(r'<a title="(.*?)" href="(.*?)" class="msk"></a>')
results_a = re.findall(pattern_a, html_doc)
print(results_a)
# 打印 [('【说唱】留住你一面,画在我心间', '/playlist?id=832790627'), ('鞋子好看|国产自赏摇滚噪音流行', '/playlist?id=721462105')]
Python爬虫基础之正则表达式的更多相关文章
- Python爬虫基础
前言 Python非常适合用来开发网页爬虫,理由如下: 1.抓取网页本身的接口 相比与其他静态编程语言,如java,c#,c++,python抓取网页文档的接口更简洁:相比其他动态脚本语言,如perl ...
- python爬虫之re正则表达式库
python爬虫之re正则表达式库 正则表达式是用来简洁表达一组字符串的表达式. 编译:将符合正则表达式语法的字符串转换成正则表达式特征 操作符 说明 实例 . 表示任何单个字符 [ ] 字符集,对单 ...
- python爬虫-基础入门-python爬虫突破封锁
python爬虫-基础入门-python爬虫突破封锁 >> 相关概念 >> request概念:是从客户端向服务器发出请求,包括用户提交的信息及客户端的一些信息.客户端可通过H ...
- python爬虫-基础入门-爬取整个网站《3》
python爬虫-基础入门-爬取整个网站<3> 描述: 前两章粗略的讲述了python2.python3爬取整个网站,这章节简单的记录一下python2.python3的区别 python ...
- python爬虫-基础入门-爬取整个网站《2》
python爬虫-基础入门-爬取整个网站<2> 描述: 开场白已在<python爬虫-基础入门-爬取整个网站<1>>中描述过了,这里不在描述,只附上 python3 ...
- python爬虫-基础入门-爬取整个网站《1》
python爬虫-基础入门-爬取整个网站<1> 描述: 使用环境:python2.7.15 ,开发工具:pycharm,现爬取一个网站页面(http://www.baidu.com)所有数 ...
- Python爬虫基础之认识爬虫
一.前言 爬虫Spider什么的,老早就听别人说过,感觉挺高大上的东西,爬网页,爬链接~~~dos黑屏的数据刷刷刷不断地往上冒,看着就爽,漂亮的校花照片,音乐网站的歌曲,笑话.段子应有尽有,全部都过来 ...
- python 爬虫基础知识一
网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动的抓取万维网信息的程序或者脚本. 网络爬虫必备知识点 1. Python基础知识2. P ...
- python爬虫基础要学什么,有哪些适合新手的书籍与教程?
一,爬虫基础: 首先我们应该了解爬虫是个什么东西,而不是直接去学习带有代码的内容,新手小白应该花一个小时去了解爬虫是什么,再去学习带有代码的知识,这样所带来的收获是一定比你直接去学习代码内容要多很多很 ...
随机推荐
- Excel阅读模式/聚光灯开发技术序列作品之三 高级自定义任务窗格开发原理简述—— 隐鹤
Excel阅读模式/聚光灯开发技术序列作品之三 高级自定义任务窗格开发原理简述—— 隐鹤 1. 引言 Excel任务窗格是一个可以用来存放各种常用命令的侧边窗口(准确的说是一个可以停靠在类名为x ...
- Java队列学习
队列是Java集合中的重要组成部分,具有先进先出的特性,使其具有广泛的应用场景,比如排队等.因此今天就来学习一下Java中的队列.本文的例子使用的Java8环境. 继承类图 学习队列,首先要知道它的类 ...
- C语言函数-strcat
strcat: 将两个char类型连接. char d[20]="GoldenGlobal"; char *s="View"; strcat(d,s); 结果放 ...
- 入坑MATLAB必会的吐血总结
本渣想回过头来整理一下MATLAB的一些基本的知识(很多东西比较琐碎,应该系统的梳理梳理),下文中没有提到的,自己用help查即可. 此文用来存个档,便于回顾. 由于matlab各版本部分语法存在差异 ...
- LOJ2276 [HAOI2017] 新型城市化 【二分图匹配】【tarjan】
题目分析: 这题出的好! 首先问题肯定是二分图的最大独立集,如果删去某条匹配边之后独立集是否会变大. 跑出最大流之后流满的边就是匹配边. 如果一个匹配边的两个端点在一个强连通分量里,那这条边删掉之后我 ...
- BZOJ 2733 永无乡
splay启发式合并 启发式合并其实就是把集合数量小的合并到集合数量大的里去. 怎么合并呢,直接一个一个插入就行了.. 用并查集维护连通性,find(i)可以找到所在splay的编号 这题好像还可以合 ...
- [BJOI2019]奥术神杖
https://www.luogu.org/problemnew/show/P5319 题解 首先观察我们要求的答案的形式: \[ \biggl(\prod V_i \biggr)^x\ \ \ x= ...
- 您必须知道的 Git 分支开发规范
Git 是目前最流行的源代码管理工具. 为规范开发,保持代码提交记录以及 git 分支结构清晰,方便后续维护,现规范 git 的相关操作. 分支管理 分支命名 master 分支 master 为主分 ...
- BeanShell 教程索引帖
一.BeanShell的基本简介 二.BeanShell环境配置 三.BeanShell语法表达式和常用命令 四.Jmeter-BeanShell使用 五.BeanShell PreProcessor ...
- css解决内联元素间的空白间隔
在内联元素的父级元素上设置font-size: 0px;即可.例如: <div class="wrap"> <ul> <li class=" ...