如何用正则表达式爬取古诗文网中的数据(python爬虫)

一、了解正则表达式的基本内容:

什么是正则表达式

正则表达式(Regular Expression,简称 regex)是一种用于匹配字符串的模式。它通过特定的语法规则,可以高效地搜索、替换和提取文本中的特定内容。正则表达式广泛应用于文本处理、数据验证、日志分析等领域。

正则表达式在爬虫中的应用

在爬虫中,正则表达式主要用于从网页源码中提取所需信息。以下是其主要应用场景:

  1. 数据提取

    • 从HTML中提取特定标签的内容,如链接、标题、图片地址等。

    • 示例:提取所有链接:<a\s+(?:[^>]*?\s+)?href="([^"]*)"

  2. 数据清洗

    • 去除多余的空格、换行符或HTML标签。

    • 示例:去除HTML标签:<[^>]+>

  3. 数据验证

    • 验证提取的数据是否符合预期格式,如邮箱、日期等。

    • 示例:验证邮箱:^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$

  4. URL匹配

    • 匹配特定模式的URL,用于过滤或分类。

    • 示例:匹配图片URL:https?://[^\s]+?\.(jpg|png|gif)

正则表达式的核心知识点

  1. 基本语法

    • 字符匹配:普通字符匹配自身,如 a 匹配字符 "a"。

    • 元字符:具有特殊含义的字符,如 . 匹配任意字符,* 匹配前一个字符的零次或多次。

  2. 字符类

    • [abc] 匹配 "a"、"b" 或 "c"。

    • [^abc] 匹配除 "a"、"b"、"c" 之外的字符。

    • \d 匹配数字,\w 匹配字母、数字或下划线,\s 匹配空白字符。

  3. 量词

    • *:零次或多次。

    • +:一次或多次。

    • ?:零次或一次。

    • {n}:恰好 n 次。

    • {n,}:至少 n 次。

    • {n,m}:n 到 m 次。

  4. 分组和捕获

    • (abc) 匹配 "abc" 并捕获。

    • (?:abc) 匹配 "abc" 但不捕获。

  5. 锚点

    • ^ 匹配字符串开头。

    • $ 匹配字符串结尾。

    • \b 匹配单词边界。

  6. 贪婪与懒惰匹配

    • 默认是贪婪匹配,尽可能匹配更多字符。

    • 在量词后加 ? 可进行懒惰匹配,尽可能匹配更少字符。

    • 示例:a.*?b 匹配 "a" 和 "b" 之间的最短内容。

总结

正则表达式是爬虫中强大的工具,能够高效提取和清洗数据。掌握其基本语法和常用技巧,能显著提升爬虫的开发效率和数据处理能力。

同时代码中还涉及到了re库的使用:

re 是 Python 标准库中用于处理正则表达式的模块,提供了丰富的函数和方法来操作字符串。通过 re 库,你可以轻松实现字符串的匹配、查找、替换和分割等操作。

re 库是 Python 中处理正则表达式的强大工具,提供了多种函数和方法来操作字符串。掌握 re 库的使用,可以显著提升文本处理的效率和灵活性,尤其在爬虫开发中,re 库是不可或缺的工具。

re 库的核心功能

  1. 编译正则表达式
    • re.compile(pattern, flags=0):将正则表达式编译成一个正则对象,便于重复使用。

    • 示例:

      pattern = re.compile(r'\d+')

  2. 匹配字符串
    • re.match(pattern, string, flags=0):从字符串开头匹配正则表达式,返回匹配对象或 None

    • 示例:

      match = re.match(r'\d+', '123abc')
      if match:print(match.group())  # 输出: 123

  3. 搜索字符串
    • re.search(pattern, string, flags=0):在字符串中搜索第一个匹配项,返回匹配对象或 None

    • 示例:

      search = re.search(r'\d+', 'abc123def')
      if search:print(search.group())  # 输出: 123

  4. 查找所有匹配项
    • re.findall(pattern, string, flags=0):返回所有匹配项的列表。

    • 示例:

      findall = re.findall(r'\d+', 'a1b2c3')
      print(findall)  # 输出: ['1', '2', '3']

  5. 查找所有匹配项(返回迭代器)
    • re.finditer(pattern, string, flags=0):返回所有匹配项的迭代器,每个元素是一个匹配对象。

    • 示例:

      finditer = re.finditer(r'\d+', 'a1b2c3')
      for match in finditer:print(match.group())  # 输出: 1, 2, 3

  6. 替换字符串
    • re.sub(pattern, repl, string, count=0, flags=0):替换字符串中所有匹配项,返回替换后的字符串。

    • 示例:

      sub = re.sub(r'\d+', 'X', 'a1b2c3')
      print(sub)  # 输出: aXbXcX

  7. 分割字符串
    • re.split(pattern, string, maxsplit=0, flags=0):根据正则表达式分割字符串,返回列表。

    • 示例:

      split = re.split(r'\d+', 'a1b2c3')
      print(split)  # 输出: ['a', 'b', 'c', '']
      

re 库的常用方法详解

  1. 匹配对象的方法

    • group():返回匹配的字符串。

    • start():返回匹配的起始位置。

    • end():返回匹配的结束位置。

    • span():返回匹配的 (起始, 结束) 位置元组。

  2. 编译标志

    • re.IGNORECASE 或 re.I:忽略大小写。

    • re.MULTILINE 或 re.M:多行模式,^ 和 $ 匹配每行的开头和结尾。

    • re.DOTALL 或 re.S. 匹配包括换行符在内的所有字符。

    • re.VERBOSE 或 re.X:允许在正则表达式中添加注释和空白符。

二、具体的爬虫代码解释(以古诗文网为例)

古诗文网-古诗文经典传承

url=唐代诗文_古诗文网https://www.gushiwen.cn/shiwens/default.aspx?cstr=%e5%94%90%e4%bb%a3 (以唐代的诗文题目为例,可扩充)

右键检查 :

具体的代码解释 :

1. requests 库的使用

  • 功能requests 是一个用于发送 HTTP 请求的 Python 库,常用于爬虫中获取网页内容。

  • 知识点

    • requests.get(url, headers=headers):发送 GET 请求,获取网页内容。

    • resp.encoding = 'utf-8':设置响应的编码格式,确保正确解析中文内容。

    • resp.text:获取响应的文本内容(HTML 源码)。

    • headers:请求头,用于模拟浏览器访问,避免被网站反爬虫机制拦截。

      • User-Agent:标识客户端类型(如浏览器),示例中使用的是 Chrome 浏览器的标识。


2. 正则表达式(re 库)

  • 功能:用于从 HTML 文本中提取目标数据(如古诗标题)。

  • 知识点

    • re.findall(pattern, string, flags):从字符串中查找所有匹配正则表达式的部分,返回一个列表。

    • 正则表达式模式:

      • r'<div\sclass="cont">.*?<b>(.*?)</b>'

        • <div\sclass="cont">:匹配 <div class="cont"> 标签。

        • .*?:非贪婪匹配任意字符(尽可能少匹配)。

        • <b>(.*?)</b>:匹配 <b> 标签中的内容,(.*?) 是捕获组,提取标题内容。

    • re.DOTALL 标志:使 . 匹配包括换行符在内的所有字符。


3. Python 函数

  • 功能:将代码模块化,提高可读性和复用性。

  • 知识点

    • def parse_page(url):定义一个函数,用于解析网页内容。

    • def spider():定义一个函数,作为爬虫的入口。

    • if __name__ == '__main__'::确保脚本在直接运行时执行 spider() 函数,而在被导入时不执行。


4. URL 和请求头

  • 知识点

    • URL

      • https://www.gushiwen.cn/shiwens/default.aspx?cstr=%e5%94%90%e4%bb%a3:目标网页地址。

      • cstr=%e5%94%90%e4%bb%a3:URL 编码,表示查询参数(这里是“唐代”)。

    • 请求头

      • headers:用于模拟浏览器访问,避免被反爬虫机制拦截。

      • User-Agent:标识客户端类型,示例中使用的是 Chrome 浏览器的标识。


5. 编码问题

  • 知识点

    • resp.encoding = 'utf-8':设置响应的编码格式为 UTF-8,确保正确解析中文内容。

    • 如果未设置编码,可能会导致乱码问题。


6. 代码执行流程

  • 知识点

    1. 调用 spider() 函数。

    2. spider() 函数调用 parse_page(url),传入目标 URL。

    3. parse_page(url) 发送 HTTP 请求,获取网页内容。

    4. 使用正则表达式从 HTML 中提取古诗标题。

    5. 打印提取的标题列表。

具体代码展示:
import requests
import reurl = "https://www.gushiwen.cn/shiwens/default.aspx?cstr=%e5%94%90%e4%bb%a3"
header = {"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36 Edg/134.0.0.0"
}def parse_page(url):resp = requests.get(url, headers=header)resp.encoding = 'utf-8'  # 确保编码正确html = resp.text# 调整正则表达式以匹配实际的HTML结构titles = re.findall(r'<div\sclass="cont">.*?<b>(.*?)</b>', html, re.DOTALL)print(titles)def spider():url = "https://www.gushiwen.cn/shiwens/default.aspx?cstr=%e5%94%90%e4%bb%a3"  # 古诗文网parse_page(url)if __name__ == '__main__':spider()
运行结果:

 

 三、改进建议:根据以上代码格式不光可以爬取古诗文题目也可以爬取内容作者等

所以后面的代码有改动: 

import requests
import re# 目标URL
url = "https://www.gushiwen.cn/shiwens/default.aspx?cstr=%e5%94%90%e4%bb%a3"# 请求头,模拟浏览器访问
header = {"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36 Edg/134.0.0.0"
}def parse_page(url):# 发送HTTP请求,获取网页内容resp = requests.get(url, headers=header)resp.encoding = 'utf-8'  # 设置编码html = resp.text# 正则表达式提取古诗的标题、作者和内容poem_pattern = re.compile(r'<div class="cont">.*?<b>(.*?)</b>.*?'  # 标题r'<p class="source">.*?<a.*?>(.*?)</a>.*?<a.*?>(.*?)</a>.*?'  # 作者r'<div class="contson".*?>(.*?)</div>',  # 内容re.DOTALL)# 查找所有匹配的古诗poems = poem_pattern.findall(html)# 遍历提取结果for poem in poems:title = poem[0].strip()  # 标题author = f"{poem[1].strip()} {poem[2].strip()}"  # 作者content = re.sub(r'<.*?>', '', poem[3]).strip()  # 去除内容中的HTML标签# 打印结果print(f"标题: {title}")print(f"作者: {author}")print(f"内容: {content}")print("-" * 50)  # 分隔线def spider():# 目标URLurl = "https://www.gushiwen.cn/shiwens/default.aspx?cstr=%e5%94%90%e4%bb%a3"parse_page(url)if __name__ == '__main__':spider()

部分正则表达式的来源: 

poem_pattern = re.compile(r'<div class="cont">.*?<b>(.*?)</b>.*?'  # 标题r'<p class="source">.*?<a.*?>(.*?)</a>.*?<a.*?>(.*?)</a>.*?'  # 作者r'<div class="contson">.*?>(.*?)</div>',  # 内容re.DOTALL
)

 

运行结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/34297.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络空间安全(33)MSF漏洞利用

前言 Metasploit Framework&#xff08;简称MSF&#xff09;是一款功能强大的开源安全漏洞利用和测试工具&#xff0c;广泛应用于渗透测试中。MSF提供了丰富的漏洞利用模块&#xff0c;允许安全研究人员和渗透测试人员利用目标系统中的已知漏洞进行攻击。 一、漏洞利用模块&…

PBS 脚本及 运行

PBS 脚本命令的调度 PBS 脚本运行命令**如何跑&#xff1f;**准备 PBS 脚本&#xff1f; 成品 本文涉及&#xff1a; PBS 命令 Shell 命令 Python 命令 使用命令行运行作业&#xff0c;需要在 HPC 中放好 PBS 脚本。 如何写一个 PBS 脚本&#xff0c;下面以自己的 PBS 脚本为例…

Spring Cloud LoadBalancer 原理与实践

背景 当前我们的微服务架构基于Spring Cloud Alibaba体系&#xff0c;通过定制NacosRule实现了跨集群访问和灰度发布功能。但随着Spring Cloud与Nacos版本升级&#xff0c;官方已弃用Ribbon转向LoadBalancer&#xff0c;这要求我们完成以下技术升级&#xff1a; 负载均衡机制…

TMS320F28P550SJ9学习笔记13: 软件I2C_驱动AT24Cxx存储芯片

今日尝试配置软件I2C通信&#xff0c;我的目标通信芯片是AT24C64&#xff0c;相较于AT24C02这样的8位寻址&#xff0c;它是16位寻址的&#xff0c;所以有些不同 文章提供测试代码讲解、完整工程下载、测试效果图 目录 软件I2C引脚初始化&#xff1a; C内联函数改变SCL与SDA的输…

电子电气架构 --- 分布到集中的动カ系统及基于域控制器的架构

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 所有人的看法和评价都是暂时的,只有自己的经历是伴随一生的,几乎所有的担忧和畏惧,都是来源于自己的想象,只有你真的去做了,才会发现有多快乐。…

1216走迷宫

1216走迷宫 ⭐️难度&#xff1a;简单 &#x1f31f;考点&#xff1a;bfs &#x1f4d6; &#x1f4da; import java.util.Arrays; import java.util.LinkedList; import java.util.Queue; import java.util.Scanner;public class Main {public static void main(String[] …

【TMS570LC4357】之相关问题及解决

背景&#xff1a; 第一次接触TI的芯片&#xff0c;对其中遇见的问题或者不清楚的地方做个记录。 问题及解决方法 1.头文件未包含 添加对应头文件 解决方法 2. error #10008-D: cannot find file “C:/ti/Hercules/SafeTI Diagnostic Library/2.4.0/libs/SafeTILib_TMS570LC…

Vue 中 this 使用指南与注意事项

文章目录 1. this 的基本概念1.1 Vue 实例中的 this1.2 this 指向问题 2. 常见问题与解决方案2.1 生命周期钩子中的 this2.2 方法中的 this2.3 回调函数中的 this 3. 高级用法与技巧3.1 使用箭头函数3.2 绑定 this3.3 使用闭包 4. 性能优化与调试4.1 性能优化策略4.2 调试技巧 …

odbus TCP转Modbus RTU网关快速配置案例

Modbus TCP 转Modbus RTU网关快速配置案例 在工业自动化领域&#xff0c;Modbus 协议以其简洁和高效而著称&#xff0c;成为众多设备通信的首选。 随着技术的发展和应用场景的变化&#xff0c;Modbus 协议也发展出了不同的版本&#xff0c;其中 Modbus TCP 和 Modbus RTU 是两种…

共享内存通信效率碾压管道?System V IPC原理与性能实测

个人主页&#xff1a;敲上瘾-CSDN博客 进程通信&#xff1a; 匿名管道&#xff1a;进程池的制作&#xff08;linux进程间通信&#xff0c;匿名管道... ...&#xff09;-CSDN博客命名管道&#xff1a;命名管道——进程间通信-CSDN博客 目录 一、共享内存的原理 二、信道的建立 …

【net1】tcp,route,iptables,macvlan

文章目录 1.局域网:CSMA/CD2.互联网:ARP,NAT,路由表比映射表复杂3.tcp协议:telnet,tcpdump,syn/accept队列4.linux的route指令:route add4.1 案例:从ubuntu机器ping 199.199.199.199,配置路由使能通5.防火墙iptables:(ip+tables)对网络上数据包通过表的形式进行规…

如何用Deepseek制作流程图?

使用Deepseek制作流程图&#xff0c;本质上是让AI根据你的需求&#xff0c;生成相关流程图的代码&#xff0c;然后在流程图编辑器中渲染&#xff0c;类似于Python一样&#xff0c;ChatGPT可以生成代码&#xff0c;但仍需在IDE中执行。 你知道绘制流程图最高效的工具是什么吗&a…

基于PySide6与CATIA Automation的批量截图处理系统开发实践

引言 本文完整实现了基于PySide6 GUI框架与CATIA Automation技术的批量截图处理系统。系统支持对CATIA文件&#xff08;.CATPart/.CATProduct&#xff09;的自动化截图、图像优化及批量导出&#xff0c;通过模块化架构设计实现了超过200%的效率提升。本文将从技术架构、核心算…

【PyQt5】【Visual Studio】环境配置

前言 最近爱上搞软件编程&#xff0c;今天我就来教学如何进行Python软件编程PyQt5 下载工具 编程环境配置 Visual Studio Python下载最新版本就行 下载完之后呢&#xff0c;简单配置一下环境&#xff0c;Visual Studio的Python环境配置教程有很多可以自己在网上找 我这有Py…

uniapp+vue实现购物车的左滑删除功能

左滑删除 删除功能利用透明的改变在显示删除按钮实现思路代码效果展示 利用scroll滑动容器来实现代码实现效果展示 我们在移动端的电商平台中&#xff0c;一般都是左滑后然后删除按钮出现&#xff0c;用户可以点击删除按钮来进行该商品的删除&#xff0c;这里我分享两种方法来达…

CSSHTML新特性

HTML5 新特性探秘 在 Web 开发的不断演进中&#xff0c;HTML5 带来了一系列令人振奋的新特性&#xff0c;极大地提升了网页的功能和用户体验。今天&#xff0c;我们就来深入探究一下这些新特性。 语义化标签&#xff1a;让网页结构更清晰 语义化标签是 HTML5 的一大亮点。在…

网络爬虫【简介】

我叫补三补四&#xff0c;很高兴见到大家&#xff0c;欢迎一起学习交流和进步 今天来讲一讲爬虫 一、网络爬虫的定义 网络爬虫&#xff08;Web Crawler&#xff09;&#xff0c;又称为网络蜘蛛、网络机器人等&#xff0c;是一种按照一定规则自动抓取互联网信息的程序或脚本。它…

数字隔离器,如何提升储能系统的安全与效能?

随着全球对光伏、风电等可再生能源需求的持续增长&#xff0c;在全球能源转型的浪潮中&#xff0c;储能技术凭借着可平衡能源供需、提高能源利用效率等优势&#xff0c;已成为实现 “双碳” 目标的核心支撑。据国家能源局公布数据显示&#xff0c;截至2024年底&#xff0c;我国…

AI玩Flappy Bird || 基于Q-Learning和DQN的机器学习

一、游戏介绍 Flappy Bird 游戏需要玩家控制一只小鸟越过管道障碍物。玩家只可以进行“跳跃”或者“不操作”两种操作&#xff0c;即点或不点。点则让小鸟上升一段距离&#xff0c;不点小鸟继续下降。若小鸟碰到障碍物或地面&#xff0c;则游戏失败。 本项目目的是开发一个深层…

【Linux内核系列】:文件系统收尾以及软硬链接详解

&#x1f525; 本文专栏&#xff1a;Linux &#x1f338;作者主页&#xff1a;努力努力再努力wz &#x1f4aa; 今日博客励志语录&#xff1a; 世界上只有一种个人英雄主义&#xff0c;那么就是面对生活的种种失败却依然热爱着生活 内容回顾 那么在之前的学习中&#xff0c;我们…