千家信息网

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

发表于:2025-02-01 作者:千家信息网编辑
千家信息网最后更新 2025年02月01日,本篇内容介绍了"Python怎么用正则表达式实现爬取古诗文网站信息"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能
千家信息网最后更新 2025年02月01日Python怎么用正则表达式实现爬取古诗文网站信息

本篇内容介绍了"Python怎么用正则表达式实现爬取古诗文网站信息"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

    分析古诗文网站

    下图1展示了古诗文网站-》诗文 栏目的首页数据。

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

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

    匹配的正则表达式是r'

    .*?(.*?)'

    1. 首先,r修饰的字符串是原生字符串,首先匹配到

    2. 通过匹配到存放总页数的标签。在标签里指定.*?

    3. (.*?) 加上() 可以指定不同的分组,这里我们只需要获取页数所以就单独添加一个分组。

    所以,最终的代码是:

     def get_total_pages():    resp = requests.get(first_url)    # 获取总页数    ret = re.findall(r'
    .*?(.*?)', 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源码,从中可以看出诗的标题被存在标签 匹配诗的标题的正则表达式是

    .*?(.*?)

    首先还是匹配到

    标签,接着就是匹配(.*?) 这里还是采用非贪婪模式来进行匹配。

    3. 提取作者和朝代

    如上图3展示了诗的作者和朝代的HTML源码,从中可以看出作者和朝代都是在

    标签下的两个a标签中。

    3.1 提取作者

    提取作者的正则表达式是

    .*?(.*?) 首先还是匹配到

    标签。接着就是匹配第一个 标签中的内容。

    3.2 提取朝代

    提取朝代的正则表达式是

    .*?(.*?) 与提取作者不同的是多了一个 ,这是因为朝代在第二个标签中。

    4. 提取诗的内容

    如上图4展示了诗的内容的HTML源码,从中可以看出诗句都在

    标签中,所以只需要匹配到这个标签里的内容即可。其正则表达式是
    (.*?)

    但是这样匹配出来的数据是包含
    标签的。所以,我们需要通过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 reimport requestsheaders = {    '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'
    .*?(.*?)', 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 # 提取标题 (.*) 进行分组,只提取标签中的内容,默认情况下 .不能匹配\n。加上re.DOTALL 表示.号可以匹配所有,贪婪模式 # titles = re.findall(r'
    .*(.*)', text,re.DOTALL) # 非贪婪模式 titles = re.findall(r'
    .*?(.*?)', text, re.DOTALL) # 提取作者 authors = re.findall(r'

    .*?(.*?)', text, re.DOTALL) # 提取朝代 dynastys = re.findall(r'

    .*?(.*?)', text, re.DOTALL) # 提取诗句 content_tags = re.findall(r'

    (.*?)
    ', 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怎么用正则表达式实现爬取古诗文网站信息"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

    0