用 Python 写爬虫的朋友是不是总在正则匹配这一步卡壳?明明网页里有想要的手机号、邮箱,正则写了半天就是匹配不到;好不容易匹配到内容,却把无关的广告文字也抓了进来;更头疼的是,网上抄的正则在工具里能用,放到代码里就报错,反复检查也找不到问题在哪。别着急,兔子哥太懂这种感受了!第一次用正则爬取商品价格时,就因为没搞懂贪婪模式,结果把 “¥99 限时特惠” 匹配成了 “¥99 限时特惠 ¥199 原价”,多抓了一堆没用的内容;还有一次想提取网页链接,正则写得太复杂,改一个符号就全乱了,折腾到半夜才搞定。今天就带大家从基础语法讲到 Python 爬虫实战,再推荐实用工具和案例源码,新手跟着学,正则匹配再也不踩坑,一起往下看吧!
一、实战必备语法:6 个核心符号,爬虫匹配全靠它
基础问题:正则符号那么多,哪些是爬虫必须掌握的?
正则符号虽然多,但爬虫常用的也就几个,新手不用死记所有符号,先吃透这 6 个,大部分匹配场景都能应付。
| 符号 / 语法 | 作用 | 爬虫常用场景 | 示例 |
|---|---|---|---|
. | 匹配任意单个字符(除换行) | 模糊匹配未知内容 | a.b匹配acb、a1b、a@b |
\d | 匹配任意数字(0-9) | 提取手机号、价格、ID | \d{11}匹配 11 位手机号 |
\w | 匹配字母、数字、下划线 | 提取用户名、标签名 | user_\w+匹配user_001、user_admin |
* | 前面字符出现 0 次或多次 | 匹配可变长度内容 | ab*c匹配ac、abc、abbc |
+ | 前面字符出现 1 次或多次 | 匹配至少有一个的内容 | \w+@\w+匹配abc@163、x_y@qq |
() | 分组提取 | 提取标签内或特定格式的内容 | 提取 h1 标签里的文本 |
兔子哥提醒:这些符号看着简单,但组合起来威力很大。比如提取邮箱的正则
\w+@\w+\.\w+,就是用\w+匹配用户名和域名,\.匹配点(注意点要转义成\.),组合起来就能精准匹配邮箱格式。必学进阶技巧:贪婪与非贪婪模式
正则默认是贪婪模式,会尽可能多匹配内容,比如用
.(.*) 提取网页标题,可能会匹配到整个网页的内容。这时候只要在*后面加个?,变成(.*?),就能启用非贪婪模式,匹配到第一个就停止,正好提取标题内容。爬虫里处理标签内容时,非贪婪模式几乎是必用的,新手一定要记牢。二、Python 爬虫中的正则:re 模块 4 个核心函数,实战用法详解
基础问题:Python 里怎么用正则?和普通正则有啥区别?
Python 里用正则要靠内置的
re模块,核心语法和通用正则一样,但函数用法有自己的特点。新手只要掌握 4 个函数,爬虫匹配基本就够用了。re 模块核心函数实战
- re.findall(pattern, string):提取所有匹配内容,返回列表
最常用的函数,比如从网页文本里提取所有手机号,一行代码就能搞定:
pythonimport retext = "用户1手机号:13812345678,用户2手机号:13987654321"phones = re.findall(r'\d{11}', text)print(phones) # 结果:['13812345678', '13987654321'] - re.search(pattern, string):提取第一个匹配内容,返回匹配对象
适合只要一个结果的场景,比如提取网页标题,找到第一个匹配就够了,需要用.group()获取内容:
pythonhtml = "正则表达式实战教程 "result = re.search(r'(.*?) ', html)if result: # 一定要判断是否匹配到,否则可能报错print(result.group(1)) # 结果:正则表达式实战教程 - re.compile(pattern):编译正则,重复使用更高效
爬大量页面时,先编译正则能节省时间,不用每次匹配都解析规则:
pythonpattern = re.compile(r'\w+@\w+\.\w+') # 编译邮箱正则text1 = "邮箱1:abc@qq.com"text2 = "邮箱2:xy_z@163.com"print(pattern.findall(text1)) # ['abc@qq.com']print(pattern.findall(text2)) # ['xy_z@163.com'] - re.sub(pattern, repl, string):替换匹配内容,清洗数据
爬取的内容常有多余空格、换行,用这个函数一键清洗:
pythondirty_text = " 提取的文本 \n 有很多空格和换行 "clean_text = re.sub(r'\s+', ' ', dirty_text).strip() # 替换空格和换行为单个空格,再去首尾空格print(clean_text) # 结果:提取的文本 有很多空格和换行
网友 “爬虫新手小周” 分享:“之前爬 100 页数据,每次都写一遍正则,速度特别慢。后来用了
re.compile,先编译再匹配,速度快了差不多一倍,原来编译正则这么重要!”三、实战案例:3 个爬虫场景手把手教,附完整源码
案例 1:爬取网页中的所有邮箱地址
步骤:
- 分析邮箱格式:
用户名@域名.后缀,正则用r'\w+@\w+\.\w+'。 - 发送请求获取网页内容,用
re.findall提取所有邮箱。 - 完整源码:
python
import reimport requests# 目标网页(示例)url = "https://www.example.com/contact"response = requests.get(url)html_text = response.text # 获取网页文本# 提取所有邮箱emails = re.findall(r'\w+@\w+\.\w+', html_text)# 打印结果print("提取到的邮箱:")for email in emails:print(email)案例 2:提取电商网页中的商品价格(格式:¥xx.xx)
步骤:
- 分析价格格式:
¥开头,后面跟数字和可能的小数点,正则用r'¥(\d+\.?\d*)'(括号分组提取数字部分)。 - 提取后可以转换成浮点数,方便后续处理。
- 完整源码:
python
import re# 模拟电商网页文本html_text = """商品1:¥99.90商品2:¥199商品3:¥299.50"""# 提取价格(分组提取数字部分)prices = re.findall(r'¥(\d+\.?\d*)', html_text)# 转换为浮点数并打印print("商品价格:")for price in prices:print(f"¥{float(price):.2f}") # 保留两位小数案例 3:清洗爬取的标题文本,去除多余标签和空格
步骤:
- 爬取的标题常包含
等标签,先用正则提取标签内的文本。 - 再用
re.sub替换多余空格和换行。 - 完整源码:
python
import re# 模拟爬取的带标签文本dirty_title = " 正则表达式实战教程 - 零基础入门
\n "# 提取标签内的文本title_without_tag = re.findall(r'(.*?)
', dirty_title)[0] # 取第一个匹配# 清洗空格和换行clean_title = re.sub(r'\s+', ' ', title_without_tag).strip()print("清洗后的标题:", clean_title) # 结果:正则表达式实战教程 - 零基础入门四、实用工具推荐:3 个神器帮你写正则、查错误
1. 在线正则测试工具
搜 “正则表达式测试工具”,随便打开一个(比如菜鸟教程的正则测试工具),输入文本和正则,能实时显示匹配结果,还能标红匹配位置。写正则时先用它测试,能少踩很多坑,新手必备。
2. RegExr(带语法提示的在线工具)
这个工具不仅能测试正则,还会显示每个符号的含义,比如输入
\d,会提示 “匹配数字”。写复杂正则时,它能帮你理清每个部分的作用,特别适合新手学习。3. Python 正则调试库(re_debug)
在 Python 代码里加
re.DEBUG参数,能打印正则的解析过程,比如:re.compile(r'\d{11}', re.DEBUG)会输出解析步骤,帮你找到正则写错的地方,适合代码级别的调试。
兔子哥个人推荐:新手先用在线测试工具写正则,确认能匹配后再放到 Python 代码里,效率会高很多。遇到匹配失败,先用在线工具对比文本和正则,大部分错误都能这样找到。
五、避坑指南:爬虫正则最容易踩的 5 个错
- 转义字符漏写,匹配失败
在 Python 里直接写'\d{11}',\d会被当成转义字符,实际生效的是d,导致匹配不到数字。解决:在字符串前加r,写成r'\d{11}',表示原始字符串,不用额外转义。 - 贪婪模式没控制,匹配内容过多
用r'(.*)'提取链接,结果匹配了整个网页的到最后一个。解决:加?启用非贪婪模式,r'(.*?)',只匹配到第一个。 - 忽略网页大小写,标签匹配不到
网页标签可能有大写(比如),正则r'匹配不到。解决:加re.IGNORECASE参数,re.findall(r',忽略大小写。 - 没考虑换行符,跨多行匹配失败
目标内容跨多行时(比如\n内容\n),.不匹配换行,导致匹配失败。解决:加re.DOTALL参数,re.search(r'(.*?)', html, re.DOTALL),让.匹配换行。 - 正则太复杂,不如用解析库
复杂网页(比如嵌套多层标签的 HTML)用正则很难精准匹配,还容易出错。解决:简单内容用正则,复杂结构用 BeautifulSoup,两者结合效率更高,别硬扛。
六、自问自答:实战中常问的问题
“正则和 BeautifulSoup 哪个更适合爬虫?什么时候该用正则?”
没有绝对的好坏!简单场景(提取手机号、邮箱、单标签内容)用正则更快更简洁;复杂场景(嵌套标签、动态加载内容)用 BeautifulSoup 更省心,它能直接定位标签。新手建议两者都学,灵活搭配使用。
“写正则有没有捷径?记不住符号怎么办?”
捷径就是多练!刚开始可以建个 “正则符号笔记”,把常用符号和例子记下来,忘了就翻一翻。写正则时先在脑子里拆分成小部分,比如提取价格拆成 “匹配 ¥”“匹配数字”“匹配小数点”,再组合起来,比直接写完整正则容易多了。
“为什么同样的正则,在不同网页效果不一样?”
因为网页结构可能不同!比如有的网页价格是
¥99,有的是,正则需要根据实际结构调整。爬新网页时,先看网页源码,再针对性写正则,别直接套用旧规则。结尾心得
正则表达式在爬虫里是 “利器”,但用不好就容易变成 “坑器”。兔子哥的经验是,新手别一开始就追求复杂正则,从简单的提取手机号、邮箱练起,熟练后再挑战标签内容提取;写正则时多利用在线工具测试,确认没问题再放到代码里;遇到匹配失败,先检查转义、贪婪模式和参数是否正确,大部分问题都能这样解决。正则和解析库不是对立的,该用正则时别犹豫,该用解析库时别硬撑。多爬几个网页,多踩几次坑,你会发现正则匹配越来越顺手,爬虫效率也会提高一大截。记住,实战是最好的老师,动手练起来比啥都重要,加油!
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。
还木有评论哦,快来抢沙发吧~