Python爬虫中使用re(正则表达式)
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、提取电影信息
假设我们需要从一个电影信息页面中提取电影名称、主演和上映时间等信息。以下是一个使用正则表达式提取这些信息的示例代码:
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
模块,我们可以更加高效地进行网页数据的抓取和处理。
版权声明:本博客内容为原创,转载请保留原文链接及作者信息。
参考文章:
原文地址:https://blog.csdn.net/NiNg_1_234/article/details/144255513
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!