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

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

分析古诗文网站

下图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正则表达式爬取网站信息的资料请关注我们其它相关文章!

(0)

相关推荐

  • Python如何利用正则表达式爬取网页信息及图片

    一.正则表达式是什么? 概念: 正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符.及这些特定字符的组合,组成一个"规则字符串",这个"规则字符串"用来表达对字符串的一种过滤逻辑. 正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配. 个人理解: 简单来说就是使用正则表达式来写一个过滤器来过滤了掉杂乱的无用的信息(eg:网页源代码-)从中来获取自己想要的内容 二.实战项目 1.爬取内容 获取上海所有三甲医院的名称并保

  • python 利用正则表达式提取特殊信息

    1.删除字符串中的 Python注释 案例: import re time = "2020-01-01 # 这是一个日期" num = re.sub(r'#.*$', "", time)#以#为分隔,去掉后面的信息 print("这个时间是:", num) 结果: 这个时间是: 2020-01-01 2.截取某符号前后的内容 案例1: txt = '我的电话是:131-246-XXX19' a = txt.split(':')[0]#0表示符号前

  • Python如何使用正则表达式爬取京东商品信息

    京东(JD.com)是中国最大的自营式电商企业,2015年第一季度在中国自营式B2C电商市场的占有率为56.3%.如此庞大的一个电商网站,上面的商品信息是海量的,小编今天就带小伙伴利用正则表达式,并且基于输入的关键词来实现主题爬虫. 首先进去京东网,输入自己想要查询的商品,小编在这里以关键词"狗粮"作为搜索对象,之后得到后面这一串网址: https://search.jd.com/Search?keyword=%E7%8B%97%E7%B2%AE&enc=utf-8,其实参数%

  • Python使用正则表达式获取网页中所需要的信息

    使用正则表达式的几个步骤: 1.用import re 导入正则表达式模块: 2.用re.compile()函数创建一个Regex对象: 3.用Regex对象的search()或findall()方法,传入想要查找的字符串,返回一个Match对象: 4.调用Match对象的group()方法,返回匹配到的字符串. 在交互式环境中简单尝试一下,查询字符串中的固话: import re text = '小明家的固话是0755-123456,而小丽家的固话时0789-654321,小王家的电话是1234

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

    目录 分析古诗文网站 1. 用正则表达式获取总页数 2. 提取诗的标题 3. 提取作者和朝代 4. 提取诗的内容 整理代码 完整源代码 总结 分析古诗文网站 下图1展示了古诗文网站->诗文 栏目的首页数据.该栏目的地址是:https://so.gushiwen.cn/shiwens/ 第二页的地址是:https://so.gushiwen.cn/shiwens/default.aspx?page=2&tstr=&astr=&cstr=&xstr= .依次类推第n页的地

  • python 爬取古诗文存入mysql数据库的方法

    使用正则提取数据,请求库requests,看代码,在存入数据库时,报错ERROR 1054 (42S22): Unknown column 'title' in 'field list'.原来是我写sql 有问题,sql = "insert into poem(title,author,content,create_time) values({},{},{},{})".format(title, author,content,crate_time) 应该写成sql = "in

  • Python爬虫实战之爬取某宝男装信息

    目录 知识点介绍 实现步骤 1. 分析目标网站 2. 获取单个商品界面 3. 获取多个商品界面 4. 获取商品信息 5. 保存到MySQL数据库 完整代码 知识点介绍 本次爬取用到的知识点有: 1. selenium 2. pymysql 3  pyquery 实现步骤 1. 分析目标网站 1. 打开某宝首页, 输入"男装"后点击"搜索", 则跳转到"男装"的搜索界面. 2. 空白处"右击"再点击"检查"审

  • Python通过正则库爬取淘宝商品信息代码实例

    使用正则库爬取淘宝商品的商品信息,首先我们需要确定想要爬取的对象 我们在淘宝里搜索"python",出来的结果 从url连接中可以得到搜索商品的关键字是"q=",所以我们要用的起始url为:https://s.taobao.com/search?q=python 然后翻页,经过对比发现,翻页后,变化的关键字是s,每次翻页,s便以44的倍数增长(可以数一下每页显示的商品数量,刚好是44) 所以可以根据关键字"s=",来设置爬取的深度(爬取多少页)

  • Python利用Xpath选择器爬取京东网商品信息

    HTML文件其实就是由一组尖括号构成的标签组织起来的,每一对尖括号形式一个标签,标签之间存在上下关系,形成标签树:XPath 使用路径表达式在 XML 文档中选取节点.节点是通过沿着路径或者 step 来选取的. 首先进入京东网,输入自己想要查询的商品,向服务器发送网页请求.在这里小编仍以关键词"狗粮"作为搜索对象,之后得到后面这一串网址: https://search.jd.com/Search?keyword=%E7%8B%97%E7%B2%AE&enc=utf-8,其中参

  • python爬虫爬取淘宝商品信息(selenum+phontomjs)

    本文实例为大家分享了python爬虫爬取淘宝商品的具体代码,供大家参考,具体内容如下 1.需求目标 : 进去淘宝页面,搜索耐克关键词,抓取 商品的标题,链接,价格,城市,旺旺号,付款人数,进去第二层,抓取商品的销售量,款号等. 2.结果展示 3.源代码 # encoding: utf-8 import sys reload(sys) sys.setdefaultencoding('utf-8') import time import pandas as pd time1=time.time()

  • Python进阶之使用selenium爬取淘宝商品信息功能示例

    本文实例讲述了Python进阶之使用selenium爬取淘宝商品信息功能.分享给大家供大家参考,具体如下: # encoding=utf-8 __author__ = 'Jonny' __location__ = '西安' __date__ = '2018-05-14' ''' 需要的基本开发库文件: requests,pymongo,pyquery,selenium 开发流程: 搜索关键字:利用selenium驱动浏览器搜索关键字,得到查询后的商品列表 分析页码并翻页:得到商品页码数,模拟翻页

  • Python爬取个人微信朋友信息操作示例

    本文实例讲述了Python爬取个人微信朋友信息操作.分享给大家供大家参考,具体如下: 利用Python的itchat包爬取个人微信号的朋友信息,并将信息保存在本地文本中 思路要点: 1.利用itchat.login(),实现微信号的扫码登录 2.通过itchat.get_friends()函数获取朋友信息 代码: 本文代码只获取了几个常用的信息,更多信息可从itchat.get_friends()中取 #获取个人微信号中朋友信息 #导入itchat包 import itchat #获取个人微信号

  • Python利用Scrapy框架爬取豆瓣电影示例

    本文实例讲述了Python利用Scrapy框架爬取豆瓣电影.分享给大家供大家参考,具体如下: 1.概念 Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中. 通过Python包管理工具可以很便捷地对scrapy进行安装,如果在安装中报错提示缺少依赖的包,那就通过pip安装所缺的包 pip install scrapy scrapy的组成结构如下图所示 引擎Scrapy Engine,用于中转调度其他部分的信号和数据

  • python爬虫使用正则爬取网站的实现

    本文章的所有代码和相关文章, 仅用于经验技术交流分享,禁止将相关技术应用到不正当途径,滥用技术产生的风险与本人无关. 本文章是自己学习的一些记录.欢迎各位大佬点评! 首先 今天是第一天写博客,感受到了博客的魅力,博客不仅能够记录每天的代码学习情况,并且可以当作是自己的学习笔记,以便在后面知识点不清楚的时候前来复习.这是第一次使用爬虫爬取网页,这里展示的是爬取豆瓣电影top250的整个过程,欢迎大家指点. 这里我只爬取了电影链接和电影名称,如果想要更加完整的爬取代码,请联系我.qq 1540741

随机推荐