文章目录
Python爬虫中使用re(正则表达式)
一、引言
在Python爬虫开发中,正则表达式(re)是一个强大的工具,它可以帮助我们从文本中提取、替换或者分割出我们想要的数据。正则表达式通过定义一系列的规则,来描述、匹配一系列符合某个句法规则的字符串。在爬虫中,我们经常需要从HTML页面中提取信息,而正则表达式提供了一种灵活且高效的方式来实现这一目的。
二、正则表达式的基本概念
1、正则表达式的组成
正则表达式由一系列字符组成,这些字符包括普通字符(例如,字母a到z)和特殊字符(称为"元字符")。普通字符表示它们自己,而元字符具有特殊含义。例如,.
(点)匹配任意单个字符,*
(星号)表示前面的字符可以出现零次或多次。
2、正则表达式的Python模块
Python中的re
模块提供了对正则表达式的支持。通过这个模块,我们可以执行各种正则表达式相关的操作,如搜索、匹配、替换和分割等。
表达式类型 | 表达式 | 描述 |
---|---|---|
字面量匹配 | abc |
匹配字符串 "abc" |
任意字符 | . |
匹配任意单个字符(除了换行符) |
字符类 | [abc] |
匹配任何一个字符 a、b 或 c |
否定字符类 | [^abc] |
匹配除了 a、b、c 之外的任意单个字符 |
范围 | [a-z] |
匹配任何一个小写字母 |
预定义字符类 | \d |
匹配任何一个数字(0-9) |
预定义字符类 | \D |
匹配任何非数字字符 |
预定义字符类 | \w |
匹配任何字母数字字符(等价于 [a-zA-Z0-9_] ) |
预定义字符类 | \W |
匹配任何非字母数字字符 |
预定义字符类 | \s |
匹配任何空白字符(空格、制表符、换行符等) |
预定义字符类 | \S |
匹配任何非空白字符 |
量词 | * |
匹配前面的子表达式0次或多次 |
量词 | + |
匹配前面的子表达式1次或多次 |
量词 | ? |
匹配前面的子表达式0次或1次 |
量词 | {n} |
匹配确定的 n 次数 |
量词 | {n,} |
至少匹配 n 次 |
量词 | {n,m} |
至少匹配 n 次,但不超过 m 次 |
非贪婪匹配 | *? |
匹配前面的子表达式0次或多次,尽可能少地匹配 |
非贪婪匹配 | +? |
匹配前面的子表达式1次或多次,尽可能少地匹配 |
非贪婪匹配 | ?? |
匹配前面的子表达式0次或1次,尽可能少地匹配 |
非贪婪匹配 | {n,m}? |
至少匹配 n 次,但不超过 m 次,尽可能少地匹配 |
组 | (...) |
将多个表达式组合成一个组,作为一个单独的单元 |
选择 | ` | ` |
断言 | ^ |
匹配输入字符串的开始位置 |
断言 | $ |
匹配输入字符串的结束位置 |
断言 | \b |
匹配一个单词边界,单词由字母、数字或下划线组成 |
断言 | \B |
匹配非单词边界 |
转义特殊字符 | \ |
匹配特殊字符的字面量(例如,\n 匹配换行符) |
1.1、步骤
以下是一些常用的re
模块函数:
re.search(pattern, string)
:在字符串中搜索第一个与正则表达式匹配的结果。re.findall(pattern, string)
:查找字符串中所有与正则表达式匹配的内容,并以列表形式返回所有匹配的结果。re.sub(pattern, repl, string)
:替换字符串中所有匹配正则表达式的内容。re.split(pattern, string)
:根据匹配的正则表达式分割字符串,返回一个列表。re.compile(pattern)
:编译正则表达式模式,返回一个正则表达式对象,以提高匹配效率。
三、使用示例
1、提取电影信息
假设我们需要从一个电影信息页面中提取电影名称、主演和上映时间等信息。以下是一个使用正则表达式提取这些信息的示例代码:
python
import requests
import re
# 请求URL
url = 'https://maoyan.com/board/4'
# 请求头部
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'
}
# 解析页面函数
def parse_html(html):
pattern = re.compile('<p class="name"><a href=".*?" title="(.*?)" data-act="boarditem-click" data-val="{movieId:\\d+}">(.*?)</a></p>.*?<p class="star">(.*?)</p>.*?<p class="releasetime">(.*?)</p>', re.S)
items = re.findall(pattern, html)
for item in items:
yield {
'电影名称': item[1],
'主演': item[2].strip(),
'上映时间': item[3]
}
# 保存数据函数
def save_data():
f = open('maoyan_top100.txt', 'w', encoding='utf-8')
response = requests.get(url, headers=headers)
for item in parse_html(response.text):
f.write(str(item) + '\n')
f.close()
if __name__ == '__main__':
save_data()
四、总结
正则表达式在Python爬虫中扮演着重要的角色,它能够帮助我们从复杂的HTML页面中提取出结构化的数据。通过掌握正则表达式的基本概念和Python中的re
模块,我们可以更加高效地进行网页数据的抓取和处理。
版权声明:本博客内容为原创,转载请保留原文链接及作者信息。
参考文章: