爬虫:python爬虫学习笔记之Beautifulsoup正则表达式
本文是我在使用网易云课堂学习日月光华老师讲的“Python爬虫零基础入门到进阶实战”课程所做的笔记,如果大家觉得不错,可以去看一下老师的视频课,讲的还是很棒的。
本文没什么营养,只是做个笔记。
Beautifulsoup
使用beautifulsoup可以直接返回源代码。
# 引入beautifulsoup
from bs4 import BeautifulSoup
html = """<div><ul><li class="item-0"><a href="link1.html">first item</a></li><li class="item-1"><a href="link2.html">second item</a> </li><li class="item-inactive"><a href="link3.html">third item</a> </li><li class="item-1"><a href="link4.html">fourth item</a></li><li class="else-0">else item</li>another item</ul></div>"""
soup = BeautifulSoup(html, 'lxml')print(soup.ul)
执行效果:
使用 . 选取元素
使用.选择元素后,默认输出的是第一个元素
# 引入beautifulsoup
from bs4 import BeautifulSoup
html = """<div><ul><li class="item-0"><a href="link1.html">first item</a></li><li class="item-1"><a href="link2.html">second item</a> </li><li class="item-inactive"><a href="link3.html">third item</a> </li><li class="item-1"><a href="link4.html">fourth item</a></li><li class="else-0">else item</li>another item</ul></div>"""
soup = BeautifulSoup(html, 'lxml')print(soup.ul.li)
执行效果图:
取出文本
# 引入beautifulsoup
from bs4 import BeautifulSoup
html = """<div><ul><li class="item-0"><a href="link1.html">first item</a></li><li class="item-1"><a href="link2.html">second item</a> </li><li class="item-inactive"><a href="link3.html">third item</a> </li><li class="item-1"><a href="link4.html">fourth item</a></li><li class="else-0">else item</li>another item</ul></div>"""
soup = BeautifulSoup(html, 'lxml')print(soup.ul.li.a.string)
执行效果图:
提取属性
类似于字典
# 引入beautifulsoup
from bs4 import BeautifulSoup
html = """<div><ul><li class="item-0"><a href="link1.html">first item</a></li><li class="item-1"><a href="link2.html">second item</a> </li><li class="item-inactive"><a href="link3.html">third item</a> </li><li class="item-1"><a href="link4.html">fourth item</a></li><li class="else-0">else item</li>another item</ul></div>"""
soup = BeautifulSoup(html, 'lxml')print(soup.a['href'])
执行效果图:
使用get方法
# 引入beautifulsoup
from bs4 import BeautifulSoup
html = """<div><ul><li class="item-0"><a href="link1.html">first item</a></li><li class="item-1"><a href="link2.html">second item</a> </li><li class="item-inactive"><a href="link3.html">third item</a> </li><li class="item-1"><a href="link4.html">fourth item</a></li><li class="else-0">else item</li>another item</ul></div>"""
soup = BeautifulSoup(html, 'lxml')print(soup.a.get('href'))
执行效果图:
使用find_all()查找元素
返回所有某种元素
# 引入beautifulsoup
from bs4 import BeautifulSoup
html = """<div><ul><li class="item-0"><a href="link1.html">first item</a></li><li class="item-1"><a href="link2.html">second item</a> </li><li class="item-inactive"><a href="link3.html">third item</a> </li><li class="item-1"><a href="link4.html">fourth item</a></li><li class="else-0">else item</li>another item</ul></div>"""
soup = BeautifulSoup(html, 'lxml')print(soup.find_all('a'))
执行效果图:
取出某个元素中的文本
# 引入beautifulsoup
from bs4 import BeautifulSoup
html = """<div><ul><li class="item-0"><a href="link1.html">first item</a></li><li class="item-1"><a href="link2.html">second item</a> </li><li class="item-inactive"><a href="link3.html">third item</a> </li><li class="item-1"><a href="link4.html">fourth item</a></li><li class="else-0">else item</li>another item</ul></div>"""
soup = BeautifulSoup(html, 'lxml')print(soup.find_all('a')[2].string)
执行效果图:
直接使用soup()与soup.find_all()效果相同
# 引入beautifulsoup
from bs4 import BeautifulSoup
html = """<div><ul><li class="item-0"><a href="link1.html">first item</a></li><li class="item-1"><a href="link2.html">second item</a> </li><li class="item-inactive"><a href="link3.html">third item</a> </li><li class="item-1"><a href="link4.html">fourth item</a></li><li class="else-0">else item</li>another item</ul></div>"""
soup = BeautifulSoup(html, 'lxml')print(soup('a')[2].string)
执行结果图:
根据属性名查找元素
找出属性名固定的元素
# 引入beautifulsoup
from bs4 import BeautifulSoup
html = """<div><ul><li class="item-0"><a href="link1.html">first item</a></li><li class="item-1"><a href="link2.html">second item</a> </li><li class="item-inactive"><a href="link3.html">third item</a> </li><li class="item-1"><a href="link4.html">fourth item</a></li><li class="else-0">else item</li>another item</ul></div>"""
soup = BeautifulSoup(html, 'lxml')print(soup(class_='item-0'))
执行效果图:
找出某个元素文本
# 引入beautifulsoup
from bs4 import BeautifulSoup
html = """<div><ul><li class="item-0"><a href="link1.html">first item</a></li><li class="item-1"><a href="link2.html">second item</a> </li><li class="item-inactive"><a href="link3.html">third item</a> </li><li class="item-1"><a href="link4.html">fourth item</a></li><li class="else-0">else item</li>another item</ul></div>"""
soup = BeautifulSoup(html, 'lxml')print(soup(class_='item-0')[0].string)
执行效果图:
结合正则表达式寻找属性名包含某段文本的元素
相当于xpath中的startwith
# 引入beautifulsoup
from bs4 import BeautifulSoup
# 引入正则表达式
import re
html = """<div><ul><li class="item-0"><a href="link1.html">first item</a></li><li class="item-1"><a href="link2.html">second item</a> </li><li class="item-inactive"><a href="link3.html">third item</a> </li><li class="item-1"><a href="link4.html">fourth item</a></li><li class="else-0">else item</li>another item</ul></div>"""
soup = BeautifulSoup(html, 'lxml')print(soup(class_=re.compile('item-'))[3].string)
执行效果图:
取出所有文本
# 引入beautifulsoup
from bs4 import BeautifulSoup
html = """<div><ul><li class="item-0"><a href="link1.html">first item</a></li><li class="item-1"><a href="link2.html">second item</a> </li><li class="item-inactive"><a href="link3.html">third item</a> </li><li class="item-1"><a href="link4.html">fourth item</a></li><li class="else-0">else item</li>another item</ul></div>"""
soup = BeautifulSoup(html, 'lxml')
print([x.strip() for x in soup.ul.get_text().split('\n') if x.strip()])
# print(soup.ul.get_text())
执行效果图:
正则表达式
Python标准库中的re模块提供正则表达式的全部功能。
import re
正则表达式方法
函数匹配
1.从匹配开头 match()
import re
text = "Beautiful is better than ugly, Explicit is better than implicit, double click 666"
# 从头开始匹配
print(re.match('Beautiful', text))
执行结果:
其中:span为匹配到的范围。
使用span()方法取出匹配位置
import re
text = "Beautiful is better than ugly, Explicit is better than implicit, double click 666"
print(re.match('Beautiful', text).span())
执行结果:
使用group()方法取出匹配内容
import re
text = "Beautiful is better than ugly, Explicit is better than implicit, double click 666"
print(re.match('Beautiful', text).group())
执行结果:
group()可以进行选择输出第几个对象
只有用括号括起来的内容才算是对象
import re
text = "Beautiful is better than ugly, Explicit is better than implicit, double click 666"
print(re.match('(\w+) is (\w+)', text).group(1))
执行结果:
使用不同模式匹配
匹配两边有空格的is/从头开始匹配
import re
text = "Beautiful is better than ugly, Explicit is better than implicit, double click 666"
print(re.match('\w+ is \w+', text).group())
执行结果:
其中:\w为匹配空格和下划线,+代表一个或多个
2.匹配整个串,一直匹配到第一个结束search()
import re
text = "Beautiful is better than ugly, Explicit is better than implicit, double click 666"
print(re.search('ugly', text).group())
执行结果:
3.替换方法 sub()
第一个参数为被替换对象,第二个参数为替换成什么,第三个参数为替换地址,第四个参数为替换次数。
import re
text = "Beautiful is better than ugly, Explicit is better than implicit, double click 666"
print(re.sub('better', '666', text, count=1))
执行结果:
利用sub()进行删除操作
import re
text = "Beautiful is better than ugly, Explicit is better than implicit, double click 666"
print(re.sub(', dou.*', '', text))
执行结果:
4.分割方法split()
最简单的分割:
import re
text = "Beautiful is better than ugly, Explicit is better than implicit, double click 666"
print(re.split(', ', text))
执行结果:
利用数字分割:
import re
text = "Beautiful is better than ugly, Explicit is better than implicit, double click 666"
print(re.split('\d+ ', text))
5.匹配整个字符串所有的匹配对象findall()
返回一个迭代对象,存储于列表之中。
import re
text = "Beautiful is better than ugly, Explicit is better than implicit, double click 666"
print(re.findall('is \w+',text))
执行结果:
如果加括号,则括号内的为匹配对象。
import re
text = "Beautiful is better than ugly, Explicit is better than implicit, double click 666"
print(re.findall('is (\w+)',text))
执行结果:
6.complie函数根据一个模式字符串和可选的标志参数生成一个字符表达式对象,该对象拥有一系列方法用于正则表达式匹配和替换。
对需要匹配的模式尽心预编译,会让速度变快。可以直接在预编译下进行查找。
import re
text = "Beautiful is better than ugly, Explicit is better than implicit, double click 666"
pat = re.compile('is (\w+)').findall(text)
print(pat)
执行结果:
7.使用不同模式查找
常用的正则表达式模式
import re
text = "Beautiful is better than ugly, Explicit is better than implicit, double click 666"
# []表示 或者的意思
pat = re.compile('[une]').findall(text)
print(pat)
执行结果:
8.对\进行转义
正则表达式实例:
提取部分内容
import re
html = """
<html><head><base href='http://example.com/'/><title>Example website</title></head><body><div id='images'><a href='image1.html'>Name:My image 1 <br /><img src='image1_thumb.jph'/></a><a href='image2.html'>Name:My image 2 <br /><img src='image2_thumb.jph'/></a><a href='image3.html'>Name:My image 3 <br /><img src='image3_thumb.jph'/></a><a href='image4.html'>Name:My image 4 <br /><img src='image4_thumb.jph'/></a><a href='image5.html'>Name:My image 5 <br /><img src='image5_thumb.jph'/></a></div>"""
# 根据前后内容,构造正则表达式模式
print(re.compile("image1.html'>(.*)<br />").findall(html))
执行结果:
提取所有文本
import re
html = """
<html><head><base href='http://example.com/'/><title>Example website</title></head><body><div id='images'><a href='image1.html'>Name:My image 1 <br /><img src='image1_thumb.jph'/></a><a href='image2.html'>Name:My image 2 <br /><img src='image2_thumb.jph'/></a><a href='image3.html'>Name:My image 3 <br /><img src='image3_thumb.jph'/></a><a href='image4.html'>Name:My image 4 <br /><img src='image4_thumb.jph'/></a><a href='image5.html'>Name:My image 5 <br /><img src='image5_thumb.jph'/></a></div>"""
# 找所有文本的共同内容
print(re.compile("html'>(.*)<br />").findall(html))
提取属性
import re
html = """
<html><head><base href='http://example.com/'/><title>Example website</title></head><body><div id='images'><a href='image1.html'>Name:My image 1 <br /><img src='image1_thumb.jph'/></a><a href='image2.html'>Name:My image 2 <br /><img src='image2_thumb.jph'/></a><a href='image3.html'>Name:My image 3 <br /><img src='image3_thumb.jph'/></a><a href='image4.html'>Name:My image 4 <br /><img src='image4_thumb.jph'/></a><a href='image5.html'>Name:My image 5 <br /><img src='image5_thumb.jph'/></a></div>"""
print(re.compile("a href='(\w+.\w+)").findall(html))
执行结果:
爬虫:python爬虫学习笔记之Beautifulsoup正则表达式相关推荐
- 数据分析与爬虫实战视频——学习笔记(一)(python基础、urllib、超时设置、自动模拟HTTP请求、异常处理、浏览器伪装、代理服务器、新闻爬虫、淘宝登陆和图片爬取)
未经允许,请勿转载. 连载未完成状态 网址: [数据挖掘]2019年最新python3 数据分析与爬虫实战_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili https://www.bilibili ...
- Python基础学习笔记之(二)
Python基础学习笔记之(二) zouxy09@qq.com http://blog.csdn.net/zouxy09 六.包与模块 1.模块module Python中每一个.py脚本定义一个模块 ...
- Python基础学习笔记之(一)
Python基础学习笔记之(一) zouxy09@qq.com http://blog.csdn.net/zouxy09 前段时间参加微软的windows Azure云计算的一个小培训,其中Pytho ...
- python模块学习笔记
python模块学习笔记 1.Python自动发送邮件smtplib 2.制作二维码图片MyQR 3.绝对值模块math 4.CSV模块 5.openpyxl 模块,操作Excel文件 ExcelMa ...
- Python爬虫 | Python爬虫获取女友图片
Python爬虫 | Python爬虫获取女友图片 前言 程序说明 二次元女友获取程序 观察网页结构 页面解析 创建图片保存路径 图片下载 格式转换 爬取结果展示 完整程序 前言 (又到了常见的无中生 ...
- python自动化测试学习笔记合集
python自动化测试学习笔记-1 一.什么是自动化 自动化测试是把以人为驱动的测试行为转化为机器执行的一种过程.直白的就是为了节省人力.时间或硬件资源,提高测试效率,便引入了通过软件或程序自动化执行 ...
- Machine Learning with Python Cookbook 学习笔记 第6章
Chapter 6. Handling Text 本笔记是针对人工智能典型算法的课程中Machine Learning with Python Cookbook的学习笔记 学习的实战代码都放在代码压缩 ...
- python爬虫项目实战教学视频_('[Python爬虫]---Python爬虫进阶项目实战视频',)
爬虫]---Python 爬虫进阶项目实战 1- Python3+Pip环境配置 2- MongoDB环境配置 3- Redis环境配置 4- 4-MySQL的安装 5- 5-Python多版本共存配 ...
- 8.Python基础学习笔记day8-正则表达式、网络编程、进程与线程
8.Python基础学习笔记day8-正则表达式.网络编程.进程与线程 一.正则表达式 ''' 1. [1,2,3,4]中任意取3个元素排列: A43 = 4x3x2 = 24itertools.pe ...
- python做直方图-python OpenCV学习笔记实现二维直方图
本文介绍了python OpenCV学习笔记实现二维直方图,分享给大家,具体如下: 官方文档 – https://docs.opencv.org/3.4.0/dd/d0d/tutorial_py_2d ...
最新文章
- 82年 AI程序员征婚启示火了!年薪百万,女生神回复
- makefile 最简单用法
- 【数字图像处理】图像内插“双线性内插法 Bilinear interpolation”代码演示(以像素中心点确定像素位置)(图像放大缩小)具有低通滤波性质,使高频分量受损,图像轮廓可能会有一点模糊
- pythonargmaxaxis1_np.argmax(input,axis)和tf.argmax(input,axis)使用
- 查看CentOS系统版本,Linux内核版本,32位还是64位
- python 写文件 换行_python中写入txt文件需要换行,以及\r 和\n
- 一文彻底弄懂 for forEach for-in for-of 的区别
- Android学习目录
- 刷屏!马化腾:腾讯只是一家普通公司,随时可以被替换
- Fortran入门教程(七)——数组
- 华为校园招聘面试题目及流程
- 渗透测试流程(一)(千峰学习笔记)
- php 句号,句号 - Programming Life - PHP博客
- NLP入门(十)使用LSTM进行文本情感分析
- #从焦虑到从容,不吼不叫养出好孩子-02做懂得沟通的父母-带着爱与慈悲来表达需求
- ECharts绘制饼图
- 史上最全综述:3D目标检测算法汇总!
- C语言实现简易日历(附源码)
- 逻辑回归-关于WOE和IV的一些理解
- camunda7、camunda8对比分析,哪个版本好
热门文章
- 47.使用外部 JavaScript 和 CSS(8)
- [2019杭电多校第七场][hdu6646]A + B = C(hash)
- Burp Suite Scanner Module - 扫描模块
- Spring MVC JSON自己定义类型转换
- 启动nginx出错:open() /var/run/nginx/nginx.pid failed (2: No such file or directory)
- 第十一篇:Mysql系列
- [BZOJ5285][HNOI2018]寻宝游戏
- c语言宏定义#define的理解与资料整理
- 3.1 栈—栈的存储实现和运算实现
- 0-1之间的随机数 C/C++