返回顶部
首页 > 资讯 > 后端开发 > Python >Python用正则表达式实现爬取古诗文网站信息
  • 234
分享到

Python用正则表达式实现爬取古诗文网站信息

2024-04-02 19:04:59 234人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

目录分析古诗文网站1. 用正则表达式获取总页数2. 提取诗的标题3. 提取作者和朝代4. 提取诗的内容整理代码完整源代码总结分析古诗文网站 下图1展示了古诗文网站—》诗文 栏目的首页

分析古诗文网站

下图1展示了古诗文网站—》诗文 栏目的首页数据。该栏目的地址是:https://so.gushiwen.cn/shiwens/

第二页的地址是:Https://so.gushiwen.cn/shiwens/default.aspx?page=2&tstr=&astr=&cstr=&xstr= 。依次类推第n页的地址就是page=n。其他不变。

1. 用正则表达式获取总页数

匹配的正则表达式是r'<div class="pagesright">.*?<span .*?>(.*?)</span>'

  1. 首先,r修饰的字符串是原生字符串,首先匹配到<div class="pagesright"> 标签,然后再通过.*?匹配到里面的里面的<a>标签<span>标签等。这里. 可以匹配到任意的一个字符(换行符除外),* 号可以匹配0或者任意多个字符。? 号表示只能匹配到1个或者0个。这里加上?号是为了使用非贪婪模式。
  2. <span .*?> 通过匹配到存放总页数的<span>标签。在标签里指定.*?
  3. (.*?) 加上() 可以指定不同的分组,这里我们只需要获取页数所以就单独添加一个分组。

所以,最终的代码是:


 def get_total_pages():
    resp = requests.get(first_url)
    # 获取总页数
    ret = re.findall(r'<div class="pagesright">.*?<span .*?>(.*?)</span>', resp.text, re.DOTALL)
    result = re.search('\d+', ret[0])
    for page_num in range(int(result.group())):
        url = 'https://so.gushiwen.cn/shiwens/default.aspx?page=' + str(page_num)
        parse_page(url)

在findall方法中传入re.DOTALL参数是为了是. 号可以匹配到换行符\n。

前面ret的结果是/ 5页。再获取5这个数字的话,还需要做一次匹配查找,这就是通过re.search('\d+', ret[0]) 来进行查找。

2. 提取诗的标题

如上图2展示了诗的标题的html源码,从中可以看出诗的标题被存在<b>标签 匹配诗的标题的正则表达式是<div class="cont">.*?<b>(.*?)</b>

首先还是匹配到<div class="cont"> 标签,接着就是匹配<b>(.*?)</b> 这里还是采用非贪婪模式来进行匹配。

3. 提取作者和朝代

如上图3展示了诗的作者和朝代的HTML源码,从中可以看出作者和朝代都是在<p class="source"></p> 标签下的两个a标签中。

3.1 提取作者

提取作者的正则表达式是<p class="source">.*?<a .*?>(.*?)</a> 首先还是匹配到<p class="source"> 标签。接着就是匹配第一个<a> 标签中的内容。

3.2 提取朝代

提取朝代的正则表达式是<p class="source">.*?<a .*?><a .*?>(.*?)</a> 与提取作者不同的是多了一个<a .*?> ,这是因为朝代在第二个<a>标签中。

4. 提取诗的内容

如上图4展示了诗的内容的HTML源码,从中可以看出诗句都在<div class="contson">标签中,所以只需要匹配到这个标签里的内容即可。其正则表达式是<div class="contson" .*?>(.*?)</div>。

但是这样匹配出来的数据是包含<br> 标签的。所以,我们需要通过sub 方法将这个标签替换掉。re.sub(r'<.*?>+', "", content)。

整理代码

至此,我们就将所有想要的数据都提取到了。接下来,我们还需要对数据进行处理。我们期望的最终数据格式是:


 poems=[
        {
            "title": '渔家傲·花底忽闻敲两桨',
            "author":'张三',
            'dynasty':'唐朝',
            'content':'xxxxxx'
        }
          {
            "title": '鹅鹅鹅',
            "author":'李四',
            'dynasty':'唐朝',
            'content':'xxxxxx'
        }
    ]

前面,我们分别得到了所有标题的列表titles;所有作者的列表authors;所有朝代的列表dynastys;所有诗句的列表contents。

那么,我们如何将这些列表组合成上面的那种形式呢?

这里,就需要用到 zip 函数了。该函数可以将多个列表组合成一个新的列表,其中列表的元素是元组。比如:


a=['name','age']
b=['张三',18]
c=zip(a,b)

调用zip 方法之后得到一个zip对象,该对象可以转换成list 对象。最终得到的结果如下图5

完整源代码


# -*- utf-8 -*-
"""
@url: https://blog.csdn.net/u014534808
@Author: 码农飞哥
@File: gushiwen_rep.py
@Time: 2021/12/7 07:40
@Desc: 用正则表达式爬取古诗文网站
古诗文网站的地址:
https://www.gushiwen.cn/
"""
import re
import requests

headers = {
    'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWEBKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.55 Safari/537.36'
}

first_url = 'https://so.gushiwen.cn/shiwens/default.aspx'


def get_total_pages():
    resp = requests.get(first_url)
    # 获取总页数
    ret = re.findall(r'<div class="pagesright">.*?<span .*?>(.*?)</span>', resp.text, re.DOTALL)
    result = re.search('\d+', ret[0])
    for page_num in range(int(result.group())):
        url = 'https://so.gushiwen.cn/shiwens/default.aspx?page=' + str(page_num)
        parse_page(url)


# 解析页面
def parse_page(url):
    resp = requests.get(url)
    text = resp.text
    # 提取标题 (.*) 进行分组,只提取<b>标签中的内容,默认情况下 .不能匹配\n。加上re.DOTALL 表示.号可以匹配所有,贪婪模式
    # titles = re.findall(r'<div class="cont">.*<b>(.*)</b>', text,re.DOTALL)
    # 非贪婪模式
    titles = re.findall(r'<div class="cont">.*?<b>(.*?)</b>', text, re.DOTALL)
    # 提取作者
    authors = re.findall(r'<p class="source">.*?<a .*?>(.*?)</a>', text, re.DOTALL)
    # 提取朝代
    dynastys = re.findall(r'<p class="source">.*?<a .*?><a .*?>(.*?)</a>', text, re.DOTALL)
    # 提取诗句
    content_tags = re.findall(r'<div class="contson" .*?>(.*?)</div>', text, re.DOTALL)
    contents = []
    for content in content_tags:
        content = re.sub(r'<.*?>+', "", content)
        contents.append(content)
    poems = []

    for value in zip(titles, authors, dynastys, contents):
        # 解包
        title, author, dynasty, content = value
        poems.append(
            {
                "title": title,
                "author": author,
                'dynasty': dynasty,
                'content': content
            }
        )
    print(poems)
    """
    poems=[
        {
            "title": '渔家傲·花底忽闻敲两桨',
            "author":'张三',
            'dynasty':'唐朝',
            'content':'xxxxxx'
        }
          {
            "title": '渔家傲·花底忽闻敲两桨',
            "author":'张三',
            'dynasty':'唐朝',
            'content':'xxxxxx'
        }
    ]
    """


"""
zip 函数
a=['name','age']
b=['张三',18]
c=zip(a,b)
c=[
    ('name','张三'),
    ('age',18)
]
"""

if __name__ == '__main__':
    get_total_pages()

最终的运行结果是:

总结

本文以古诗文网为例演示了如何通过正则表达式来爬取网站数据。 

以上就是python用正则表达式实现爬取古诗文网站信息的详细内容,更多关于Python正则表达式爬取网站信息的资料请关注编程网其它相关文章!

--结束END--

本文标题: Python用正则表达式实现爬取古诗文网站信息

本文链接: https://lsjlt.com/news/159659.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Python用正则表达式实现爬取古诗文网站信息
    目录分析古诗文网站1. 用正则表达式获取总页数2. 提取诗的标题3. 提取作者和朝代4. 提取诗的内容整理代码完整源代码总结分析古诗文网站 下图1展示了古诗文网站—》诗文 栏目的首页...
    99+
    2024-04-02
  • Python怎么用正则表达式实现爬取古诗文网站信息
    本篇内容介绍了“Python怎么用正则表达式实现爬取古诗文网站信息”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!分析古诗文网站下图1展示了古...
    99+
    2023-06-25
  • Python如何利用正则表达式爬取网页信息及图片
    一、正则表达式是什么? 概念: 正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来...
    99+
    2024-04-02
  • Python怎么利用正则表达式爬取网页信息及图片
    小编给大家分享一下Python怎么利用正则表达式爬取网页信息及图片,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、正则表达式是什么概念:正则表达式是对字符串操作...
    99+
    2023-06-14
  • JavaScript正则表达式实现注册信息校验功能
    目录注册信息校验需求案例分析Java和JavaScript正则表达式的对比 Java中也有正则表达式,默认情况下必须要精确匹配 ;而在JS中默认是模糊匹配,只要字符串包含了正则表达式...
    99+
    2024-04-02
  • JS如何实现身份证信息验证正则表达式
    小编给大家分享一下JS如何实现身份证信息验证正则表达式,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!很多时候我们都是通过一组正则...
    99+
    2024-04-02
  • python用正则表达式提取/匹配中文汉字
    目录python用正则表达式提取中文python正则如何匹配中文汉字总结python用正则表达式提取中文 Python re正则匹配中文,其实非常简单,把中文的unicode字符串转...
    99+
    2024-04-02
  • Python爬虫实现网页信息抓取功能示例【URL与正则模块】
    本文实例讲述了Python爬虫实现网页信息抓取功能。分享给大家供大家参考,具体如下: 首先实现关于网页解析、读取等操作我们要用到以下几个模块 import urllib import urllib2 i...
    99+
    2022-06-04
    爬虫 正则 示例
  • python网络爬虫精解之正则表达式的使用说明
    目录一、常见的匹配规则二、常见的匹配方法1、match()2、search()3、findall()4、sub()5、compile()一、常见的匹配规则 二、常见的匹配方法 1、...
    99+
    2024-04-02
  • Python爬虫实现抓取电影网站信息并入库
    目录一.环境搭建1.下载安装包2.修改环境变量3.安装依赖模块二.代码开发三.运行测试1.新建电影信息表2.代码运行四.问题排查和修复1.空白字符报错2.请求报错一.环境搭建 1.下...
    99+
    2024-04-02
  • Python使用正则表达式实现文本替换的方法
    本文实例讲述了Python使用正则表达式实现文本替换的方法。分享给大家供大家参考,具体如下: 2D客户端编程从某种意义上来讲就是素材组织,所以,图片素材组织经常需要批量处理,python一定是最佳选择,不管...
    99+
    2022-06-04
    文本 方法 正则表达式
  • Python正则表达式实现截取成对括号的方法
    本文实例讲述了Python正则表达式实现截取成对括号的方法。分享给大家供大家参考,具体如下: strs = '1(2(3(4(5(67)6)7)8)9)0' reg1 = re.compile('([(...
    99+
    2022-06-04
    括号 方法 正则表达式
  • Python使用正则表达式抓取网页图片的方法示例
    本文实例讲述了Python使用正则表达式抓取网页图片的方法。分享给大家供大家参考,具体如下: #!/usr/bin/python import re import urllib #获取网页信息 def ...
    99+
    2022-06-04
    示例 网页 方法
  • 如何使用Python爬虫实现抓取电影网站信息并入库
    这篇文章主要介绍如何使用Python爬虫实现抓取电影网站信息并入库,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一.环境搭建1.下载安装包访问 Python官网下载地址:https://www.python.org/...
    99+
    2023-06-29
  • Python使用re模块实现正则表达式操作指南
    目录一、前言二、匹配字符串1.使用match()方法进行匹配2.使用search()方法进行匹配3.使用findall()方法进行匹配三、替换字符串四、使用正则表达式分割字符串总结&...
    99+
    2024-04-02
  • python读取eml文件并用正则表达式匹配邮箱的代码
    目录下面看看python正则表达式匹配邮箱1. 一次匹配多个邮箱的情况2. 一次匹配一个今天接到一个需求有一个同事离职了,但是留下了非常多(2W多封)的邮件,我需要将他的邮件进行分类...
    99+
    2022-11-13
    python读取eml文件 python 正则匹配邮箱
  • Java使用正则表达式如何实现查找文本功能
    本篇文章为大家展示了Java使用正则表达式如何实现查找文本功能,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。具体如下:REMatch.java:package reMatch;import java...
    99+
    2023-05-31
    java 正则表达式 ava
  • Java如何使用正则表达式实现替换文本功能
    本篇文章给大家分享的是有关Java如何使用正则表达式实现替换文本功能,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。具体如下:package replaceDemo;import...
    99+
    2023-05-31
    java 正则表达式 ava
  • 怎么在python中使用正则表达式实现零宽断言
    怎么在python中使用正则表达式实现零宽断言?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。python的数据类型有哪些python的数据类型:1. 数字类型,包括int(整型...
    99+
    2023-06-14
  • 怎么用Python正则表达式实现分页按钮href替换
    本篇内容介绍了“怎么用Python正则表达式实现分页按钮href替换”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!帖子上有分页功能的按钮,如...
    99+
    2023-06-17
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作