zoukankan      html  css  js  c++  java
  • 正则-提取某情话网站所有情话内容

    #爬取https://wenxue.7139.com/5107/这个页面所有标题和内容
    #保存到HTML文件中,标题用h1 内容用p格式
    import urllib.request
    import urllib.parse
    import re
    
    
    #定义过滤回传HTML中所有html标签  这部分时候来看大佬们写的方法加入的 目前还不是很懂  但是会用其功能就行
    def filter_tags(htmlstr):
        #先过滤CDATA
        re_cdata=re.compile('//<![CDATA[[^>]*//]]>',re.I) #匹配CDATA
        re_script=re.compile('<s*script[^>]*>[^<]*<s*/s*scripts*>',re.I)#Script
        re_style=re.compile('<s*style[^>]*>[^<]*<s*/s*styles*>',re.I)#style
        re_br=re.compile('<brs*?/?>')#处理换行
        re_h=re.compile('</?w+[^>]*>')#HTML标签
        re_comment=re.compile('<!--[^>]*-->')#HTML注释
        s=re_cdata.sub('',htmlstr)#去掉CDATA
        s=re_script.sub('',s) #去掉SCRIPT
        s=re_style.sub('',s)#去掉style
        s=re_br.sub('
    ',s)#将br转换为换行
        s=re_h.sub('',s) #去掉HTML 标签
        s=re_comment.sub('',s)#去掉HTML注释
        #去掉多余的空行
        blank_line=re.compile('
    +')
        s=blank_line.sub('
    ',s)
        s=replaceCharEntity(s)#替换实体
        return s
    def replaceCharEntity(htmlstr):
        CHAR_ENTITIES={'nbsp':' ','160':' ',
            'lt':'<','60':'<',
            'gt':'>','62':'>',
            'amp':'&','38':'&',
            'quot':'"','34':'"',}
    
        re_charEntity=re.compile(r'&#?(?P<name>w+);')
        sz=re_charEntity.search(htmlstr)
        while sz:
            entity=sz.group()#entity全称,如>
            key=sz.group('name')#去除&;后entity,如>为gt
            try:
                htmlstr=re_charEntity.sub(CHAR_ENTITIES[key],htmlstr,1)
                sz=re_charEntity.search(htmlstr)
            except KeyError:
                #以空串代替
                 htmlstr=re_charEntity.sub('',htmlstr,1)
                 sz=re_charEntity.search(htmlstr)
        return htmlstr
    
    
    
    #根据传过来的文章url,获取服务器请求,并过滤出文章内容
    def get_text(a_href):
        #调用函数构建请求对象
        request = handle_request(a_href)
        #发送请求,获得响应
        content = urllib.request.urlopen(request).read().decode("gb18030")
        #解析过滤内容
        pattern = re.compile(r'<div class="content" id="content">(d|.*?)</div>',re.S)
        #此处是过滤出来的含有HTML标签的文本
        lt = pattern.findall(content)
        lt = filter_tags(str(lt))
        #print(lt)
        #exit()
        return lt
    
    #定义一个拼接url的函数
    def handle_request(url,page=None):
        #拼接指定url
        if page !=None:
            url =url + str(page) +".html"
        #print(url)
        #构造请求头
        headers = {
        "User-Agent": 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36'
    }
        request = urllib.request.Request(url=url,headers=headers)
        return request
    
    #定义解析返回内容的函数
    def parse_content(content):
        #写正则
        pattern = re.compile(r'<a href="(//wenxue.7139.com/5107/d{2}/d+.html)" title=".*" target="_blank">·(.*?)</a>')
        #返回的lt是一个列表,列表中的元素都是元组,
        # 元组中的第一个元素就是正则中第一个小括号匹配的内容, 作为合成url
        # 元组中第二个元素就是正则中第二个小括号匹配的内容  作为标题
        lt = pattern.findall(content)
        #print(lt)
        #print(len(lt))
        #遍历列表
        for href_title in lt:
            #获取内容的连接
            a_href = "https:"+href_title[0]
            #获取内容的标题
            title = href_title[-1]
            #向a_href发送请求,获取响应内容
            #定义一个get_text函数,专门处理上一行的任务
            text = get_text(a_href)
            #print(text)
            #exit()
            #写入到HTML文件中
            string = "<h1>%s</h1>%s" % (title,text)
            with open("AiQing.html","a",encoding="utf8") as fp:
                fp.write(string)
    
    
    def main():
        url = "https://wenxue.7139.com/5107/index_"
        start_page = int(input("请输入起始页码:(只能从第二页开始)"))
        end_page = int(input("请输入结束页码:"))
        for page in range(start_page,end_page + 1):
            #根据url和page生成指定的request
            request = handle_request(url,page)
            #发送请求
            content = urllib.request.urlopen(request).read().decode("gbk")
            #print(content)
            #解析内容
            parse_content(content)
    
    
    
    
    
    if __name__=='__main__':
        main()

    作者:求知鱼

    -------------------------------------------

    个性签名:你有一个苹果,我有一个苹果,我们交换一下,一人还是只有一个苹果;你有一种思想,我有一种思想,我们交换一下,一个人就有两种思想。

    如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个“推荐”哦,博主在此感谢!

    独学而无友,则孤陋而寡闻,开源、分享、白嫖!

  • 相关阅读:
    Difference between 2>&-, 2>/dev/null, |&, &>/dev/null and >/dev/null 2>&1
    (OK)(OK) docker-(centos-quagga-ospf-mdr)--NS3--MANET
    How to Interactively Create a Docker Container
    (OK)(www.nrl.navy.mil) OSPF MANET Designated Routers (OSPF-MDR) Implementation
    docker-batman
    (OK)(OK) NS3
    quagga-mtr——Multi-Topology Routing support for quagga routing suite
    (OK)(OK) seem-tools-CLI-manual.sh
    (OK)(OK) seem-tools-CLI-semi-auto.sh
    (OK)(OK) manet-seem-template.cc
  • 原文地址:https://www.cnblogs.com/Qiuzhiyu/p/12182791.html
Copyright © 2011-2022 走看看