首页 > Web开发 > 详细

正则-提取某情话网站所有情话内容

时间:2020-01-12 16:24:08      阅读:88      评论:0      收藏:0      [点我收藏+]
#爬取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*script\s*>,re.I)#Script
    re_style=re.compile(<\s*style[^>]*>[^<]*<\s*/\s*style\s*>,re.I)#style
    re_br=re.compile(<br\s*?/?>)#处理换行
    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(\n,s)#将br转换为换行
    s=re_h.sub(‘‘,s) #去掉HTML 标签
    s=re_comment.sub(‘‘,s)#去掉HTML注释
    #去掉多余的空行
    blank_line=re.compile(\n+)
    s=blank_line.sub(\n,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()

技术分享图片

正则-提取某情话网站所有情话内容

原文:https://www.cnblogs.com/Qiuzhiyu/p/12182791.html

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