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

#爬取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()

posted @ 2020-01-12 15:28  求知鱼  阅读(312)  评论(0编辑  收藏  举报