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('\n','').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。

 

posted @ 2017-08-31 17:06  HsiehTengK`o  阅读(289)  评论(0编辑  收藏  举报