• python 正则抓取古诗词


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

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

    HTML:

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

    group 详解

    import re
    a = "123abc456"
    print re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(0)   #123abc456,返回整体
    print re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(1)   #123
    print re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(2)   #abc
    print re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(3)   #456

    究其因

    1. 正则表达式中的三组括号把匹配结果分成三组

    •  group() 同group(0)就是匹配正则表达式整体结果
    •  group(1) 列出第一个括号匹配部分,group(2) 列出第二个括号匹配部分,group(3) 列出第三个括号匹配部分。

    2. 没有匹配成功的,re.search()返回None

    3. 当然郑则表达式中没有括号,group(1)肯定不对了。

    抓取古诗案例

    # -*- 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 />', '
    ', content)        # 用于替换字符串中的匹配项
                            content = re.sub(r'<p>', '', content)
                            content = re.sub(r'</p>', '', content)
    
                            print('正在获取 {title}'.format(title=title))
                            f.write('{title}{content}
    '.format(title=title, content=content))
    
    
    if __name__ == '__main__':
        start_url = 'https://so.gushiwen.org/authors/authorvsw_b90660e3e492A'
        crawl(start_url)
    import pyautogui
    import pyperclip
    pyperclip.copy(songs)  # 需要发送的内容早起的鸟儿有霾吸
    pyautogui.hotkey('ctrl', 'v')  # 按下 ctrl + v 粘贴内容
    pyautogui.hotkey('Enter')
    故乡明
  • 相关阅读:
    mysql 开发进阶篇系列 18 MySQL Server(innodb_buffer_pool_size)
    sql server 备份与恢复系列三 简单恢复模式下的备份与还原
    (后端)SQL Server日期时间函数
    (网页)the server responded with a status of 403 (Forbidden)
    (其他)小程序介绍和开发
    (网页)jQuery UI 实例
    (其他)令人忧虑,不阅读的中国人
    (其他)程序员的8种好习惯
    (后端)NoSuchMethodError
    JsonParseException:非法的unquoted字符((CTRL-CHAR,代码9)):必须被转义
  • 原文地址:https://www.cnblogs.com/luweiweicode/p/14335573.html
Copyright © 2020-2023  润新知