首页 > 编程语言 > 详细

python 正则抓取古诗词

时间:2021-01-27 17:03:47      阅读:59      评论:0      收藏:0      [点我收藏+]

tags: #正则表达式 #HTML提取

  • 匹配任意字符不能跨行:.*
  • 匹配任意字符包括换行符等:[\s\S]*
  • 捕获某前缀与某后缀之间的任意字符:(.*?)
  • 使用情况举例,捕获下面HTML中的文字“不迟any”  HTML:<a href=‘http://www.cnblogs.com/buchiany/‘>不迟any</a>  匹配的正则表达式:<a.*?>(.*?)<\/a>
  • 匹配任意空白(包含空格、\f换页符、\n换行符、\r回车符、\t制表符、\v垂直制表符):[\s]*  使用情况举例,匹配下面HTML内容里第一行<tr>和第三行<th>,之间跨越了空白

HTML:

要匹配的内容第一部分<tr> 

   <th>要匹配的内容第二部分
匹配的正则表达式:<tr>[\s]*<th>

 

抓取古诗案例

# -*- coding:utf-8 -*-
import re
import requests

def crawl(start_url):
    base_url = ‘http://so.gushiwen.org‘
    req_headers = {‘User-Agent‘: ‘Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36‘}
    for i in range(1, 126):
        restart_url = start_url + str(i) + ‘.aspx‘
        print(restart_url)
        res = requests.get(restart_url, headers=req_headers)
        if res.status_code == requests.codes.ok:
            html = res.text
            # 获取所有诗的链接
            parttern_href = re.compile(r‘<div class="cont">.*?<p><a .*? href="(.*?)" .*?>.*?</p>‘, flags=re.DOTALL)   # 标红的部分为捕获  将会直接返回
            hrefs = re.findall(parttern_href, html)   # 在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。
            # 获取每一首诗的内容,并保存到本地
            with open(‘李白诗集.txt‘, mode=‘a‘, encoding=‘utf-8‘) as f:
                for href in hrefs:
                    res = requests.get(base_url + href, headers=req_headers)
                    if res.status_code == requests.codes.ok:
                        # 标题
                        parttern_title = re.compile(r‘<div class="cont">.*?<h1 .*?>(.*?)</h1>‘, re.DOTALL)  # 标红的部分为捕获 将会直接返回
                        title = re.search(parttern_title, res.text).group(1)
                        # 内容
                        parttern_content = re.compile(r‘<div class="cont">.*?<div class="contson" id=".*?">(.*?)</div>‘,re.DOTALL)  # 标红的部分为捕获 将会直接返回
                        content = re.search(parttern_content, html).group(1)    # 扫描整个字符串并返回第一个成功的匹配。
                        content = re.sub(r‘<br />‘, ‘\n‘, content)        # 用于替换字符串中的匹配项
                        content = re.sub(r‘<p>‘, ‘‘, content)
                        content = re.sub(r‘</p>‘, ‘‘, content)

                        print(‘正在获取 {title}‘.format(title=title))
                        f.write(‘{title}{content}\n‘.format(title=title, content=content))


if __name__ == ‘__main__‘:
    start_url = ‘https://so.gushiwen.org/authors/authorvsw_b90660e3e492A‘
    crawl(start_url)

 

python 正则抓取古诗词

原文:https://www.cnblogs.com/luweiweicode/p/14335573.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!