• Python——正则表达式初步应用(一)


    1、先附上转载(www.cnblogs.com/huxi)的一张图,有重要的参考价值,其含义大家请通过阅读来理解。

    2、附上初步学习Python时编写的一个爬糗事百科段子的代码。

     1 # -*- coding: utf-8 -*-
     2 import urllib
     3 import urllib.request
     4 import re
     5 import os
     6 from os import makedirs
     7 
     8 if __name__ == '__main__':
     9     print('Start getting data...')
    10     for i in range(1,13):
    11         url = 'https://www.qiushibaike.com/text/page/'+str(i)+'/'
    12         #url = 'https://www.qiushibaike.com/text/page/1/'
    13         user_agent = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36 QIHU 360SE'
    14         headers = {'User-Agent':user_agent}
    15         request = urllib.request.Request(url = url,headers = headers)
    16         response = urllib.request.urlopen(request)
    17         #print(response)
    18         content = response.read()
    19         content = content.decode('utf8')
    20         #print(content) last step proves to be necessary
    21         
    '''这里是本片内容表述的重点''' 22 patternArticleNum =re.compile('(?<=<a href="/article/)[1-9][0-9]{7,}(?=" target=")',re.S) 23 patternArticle =re.compile('<div class="content">s<span>(.*?)s</span>',re.S) 24 #print(re.findall(pattern,content)) 25 itemsArticleNum = re.findall(patternArticleNum,content) 26 lenItemsArticleNum =len(itemsArticleNum) 27 #print(lenItemsArticleNum) 28 itemsArticle = re.findall(patternArticle,content) 29 #itemsArticle = itemsArticle.encode('utf8') 30 #lenItemsArticle = len(itemsArticle) 31 #print(lenItemsArticle) 32 #items = re.split(pattern,content) 33 #print(items) type(item)=tuple 34 #print(itemsArticleNum[0]) 35 print(itemsArticle) 36 path = 'qiubai' 37 if not os.path.exists(path): 38 os.makedirs(path) 39 while lenItemsArticleNum > -1: 40 lenItemsArticleNum = lenItemsArticleNum - 1 41 file_path = path + '/' + itemsArticleNum[lenItemsArticleNum]+ '.txt' 42 f = open(file_path,'w') 43 itemsArticle[lenItemsArticleNum] = itemsArticle[lenItemsArticleNum].replace(' ','').replace('<br/>','').replace('u261e','') .replace('u261c','').replace('u0ca5','').replace('ufffc','').replace('u26bd','').replace('uff78','').replace('uff9e','').replace('uff6f','') 44 #itemsArticle[lenItemsArticleNum] = str(str(itemsArticle[lenItemsArticleNum]).encode('gb2312') 45 f.write(itemsArticle[lenItemsArticleNum]) 46 f.close() 47 #file_path = path + '/' + item[0]+ '.txt' 48 #for itemArticle in itemsArticle: 49 # print(itemsArticle) 50 print('Data acquireing compnished...') 51

    3、查看网页源代码,发现我们所需要的内容具备如下的结构:

    <a href="/article/119488591" target="_blank" class="contentHerf" onclick="_hmt.push(['_trackEvent','web-list-content','chick'])">
    <div class="content">
    <span>
    
    
    今天看见的新闻:古有凿壁偷光,今有男子凿壁偷窥。杭州闸弄口派出所接到一名年轻姑娘报警,称隔壁男子在墙上挖了一个洞偷窥她。据民警介绍,男子自己交代,他是看到姑娘后起了歹念,洞是用手抠出来的……
    
    </span>
    
    </div>

    标黄的使我们关注的两部分内容,一是文章编号,提取后名为文本文件名称,二是段子内容,为文本文件内容。

    4、如何提取文章编号:

    patternArticleNum =re.compile('(?<=<a href="/article/)[1-9][0-9]{7,}(?=" target=")',re.S)
    (?<=<a href="/article/):筛选前缀包含:<a href="/article的文本
    [1-9][0-9]{7,} 筛选第一位是1-9,第二位是0-9,的,九位数及以上数字。{7,}表示匹配前一个字符7次及以上。
    (?=" target=") 筛选后缀包含" target="的文本内容。

    5、如何提取段子文本

    <div class="content">s<span>(.*?)s</span>
    <div class="content">s<span>  筛选前缀包含<div class="content">s<span>的文本,s代表空白字符。 
    s</span> 筛选后缀包含s</span>的文本,
    (.*?) 代表两者之间的所有字符,要用()括起来。

    6、提取的公式

    patternArticleNum =re.compile('(?<=<a href="/article/)[1-9][0-9]{7,}(?=" target=")',re.S)
    itemsArticleNum = re.findall(patternArticleNum,content)
    patternArticle
    =re.compile('<div class="content">s<span>(.*?)s</span>',re.S) itemsArticle = re.findall(patternArticle,content)

    需要调用re库,使用compile和正则表达式生成所需的pattern,利用re.findall在content内容里面匹配并读取出来。

    备注1:content的获得:

    (1)、根据Headers和User Agenturllib.request.Request()设置一个request。

    (2)、用urllib.request.urlopen()根据这个request生成一个response。

    (3)、最后用response.read()读取出来。

    备注2:Python3.6中取消了urllib2,取而代之是自带的urllib.request。

  • 相关阅读:
    jquery实现下拉框多选
    最好的Angular2表格控件
    CSS3阴影 box-shadow的使用和技巧总结
    存档2
    Python的编码注释# -*- coding:utf-8 -*-
    路由器与交换机区别
    TCP的流量控制
    TCP的拥塞控制
    存储管理之页式、段式、段页式存储
    什么是死锁?其条件是什么?怎样避免死锁?
  • 原文地址:https://www.cnblogs.com/shadrach/p/7459257.html
Copyright © 2020-2023  润新知