使用Python正则表达式RE从CSDN博客源代码中匹配出博客信息

简介:

前面我们说到了如何在Python正则表达式z中匹配中文,说到了另一种方法,这就是如何巧妙的使用Python正则表达式匹配模式的问题了

Python匹配模式

re.compile(strPattern[, flag]):

这个方法是Pattern类的工厂方法,用于将字符串形式的正则表达式编译为Pattern对象。 第二个参数flag是匹配模式,取值可以使用按位或运算符'|'表示同时生效,比如re.I | re.M。另外,你也可以在regex字符串中指定模式,比如re.compile('pattern', re.I | re.M)与re.compile('(?im)pattern')是等价的。
可选值有:

主要非英文语系字符范围

模式 名称 说明
re.I re.IGNORECASE 忽略大小写(括号内是完整写法,下同)
re.M MULTILINE 多行模式,改变'^'和'$'的行为
re.S DOTALL 点任意匹配模式,改变'.'的行为, 使".“可以匹配任意字符
re.L LOCALE 使预定字符类 \w \W \b \B \s \S 取决于当前区域设定
re.U UNICODE 使预定字符类 \w \W \b \B \s \S \d \D 取决于unicode定义的字符属性
re.X VERBOSE 详细模式。这个模式下正则表达式可以是多行,忽略空白字符,并可以加入注释。以下两个正则表达式是等价的:

 

具体参见如下代码

 

[python] view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. #!coding:utf-8  
  2.   
  3. import re  
  4. import sys  
  5. import urllib2  
  6.   
  7.   
  8. # 测试匹配中文信息  
  9. def TestReChinese( ):  
  10.     reload(sys)  
  11.     sys.setdefaultencoding( "utf-8" )  
  12.   
  13.     # 这段HTML代码是从博客列表页面中摘取出来的单个博客的信息, 我们要从中摘取出  
  14.     page  =   r"""<div class="list_item article_item"> 
  15.              
  16.     <div class="article_title">    
  17.         <span class="ico ico_type_Original"> 
  18.         </span> 
  19.                  
  20.         <h1> 
  21.             <span class="link_title"> 
  22.                 <a href="/gatieme/article/details/43235791"> 
  23.                 Python正则表达式匹配中文 
  24.                 </a> 
  25.             </span> 
  26.         </h1> 
  27.     </div> 
  28.  
  29.     <div class="article_description"> 
  30.     在使用Python的过程中,由于需求原因,我们经常需要在文本或者网页元素中用Python正则表达式匹配中文,但是我们经常所熟知的正则表达式却只能匹配英文,而对于中文编码却望尘莫及,于是我大量Google,几经Baidu,花了两个多个小时测试,终于发现解决的办法。特记录如下    字符串的角度来说,中文不如英文整齐、规范,这是不可避免的现实。本文结合网上资料以及个人经验,以 python 语言为例,...         
  31.     </div> 
  32.          
  33.     <div class="article_manage"> 
  34.              
  35.         <span class="link_postdate">2015-01-28 19:34 
  36.         </span> 
  37.              
  38.         <span class="link_view" title="阅读次数"> 
  39.             <a href="/gatieme/article/details/43235791" title="阅读次数">阅读</a>(64) 
  40.         </span> 
  41.              
  42.         <span class="link_comments" title="评论次数"> 
  43.             <a href="/gatieme/article/details/43235791#comments" title="评论次数" onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_pinglun'])">评论</a>(0) 
  44.         </span> 
  45.      
  46.         <span class="link_edit"><a href="http://write.blog.csdn.net/postedit/43235791" title="编辑">编辑</a> 
  47.         </span> 
  48.              
  49.         <span class="link_delete"><a href="javascript:void(0);" onclick="javascript:deleteArticle(43235791);return false;" title="删除">删除</a> 
  50.         </spa    </div> 
  51.  
  52.     <div class="clear"> 
  53.     </div> 
  54. </div>"""  
  55.     req = urllib2.Request("http://blog.csdn.net/gatieme/article/list/1")                # 建立页面请求  
  56.     req.add_header("User-Agent""Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)")  
  57.               
  58.     try:  
  59.         cn = urllib2.urlopen(req)  
  60.         page = cn.read( )  
  61.         unicodePage = page.decode("utf-8")  
  62.         cn.close( )  
  63.     except urllib2.URLError, e:  
  64.         print 'URLError:', e.code  
  65.         return  
  66.     except urllib2.HTTPError, e:  
  67.         print 'HTTP Error:' + e.reason  
  68.         return     
  69.   
  70.     # 从博客页面中匹配出每个博客的地                                                                           址  
  71.     reHtml = r'<span class="link_title"><a href="(.*?)">\s*(.*?)\s*</a></span>.*?<span class="link_postdate">(.*?)</span>\s*<span class="link_view" title=".*?"><a href="(.*?)" title=".*?">.*?</a>(.*?)</span>\s*<span class="link_comments" title=".*?"><a href="(.*?)#comments" title=".*?" onclick=".*?">.*?</a>(.*?)</span>'  
  72. #####-----------------------------------------------------------    
  73.     # [示例1]----写法1 匹配失败, 无法匹配中文  
  74.     # pattern = re.compile(reHtml)  
  75.     # myItems = re.findall(pattern, unicodePage)    
  76.   
  77.     # [示例1]----写法2 匹配失败, 无法匹配中文  
  78.     # myItems = re.findall(reHtml, unicodePage)     
  79. #####-----------------------------------------------------------  
  80.   
  81. #####-----------------------------------------------------------  
  82.     # [示例2]----写法1, 匹配成功, re.S使用DOTALL模式可以匹配中文  
  83.     # 写法说明    
  84.     #   Ⅰ将字符串编译成re.S[DOTALL]模式下正则表达式  
  85.     #   Ⅱ在使用正则表达式文本或者HTML代码中匹配博客信息  
  86.     pattern = re.compile(reHtml, re.S)  
  87.     myItems = re.findall(pattern, unicodePage)  
  88.    
  89.     # [示例2]----写法2, 匹配成功, re.S使用DOTALL模式可以匹配中文  
  90.     #   Ⅰ将字符串编译成re.S[DOTALL]模式下正则表达式  
  91.     #   Ⅱ直接用编译好的正则表达式在文本或者HTML代码中匹配博客信息  
  92.     # pattern = re.compile(reHtml, re.S)  
  93.     # myItems = pattern.findall(unicodePage)  
  94.   
  95.     # [示例2]----写法3, 匹配成功, re.S使用DOTALL模式可以匹配中文  
  96.     #   Ⅰ  
  97.     #   Ⅱ不编译正则表达式,直接在文本或者HTML代码中匹配博客信息  
  98.     # myItems = re.findall(reHtml, unicodePage, re.S)  
  99.   
  100.     print len(myItems)  
  101.     # print myItems  
  102.     for item in myItems:  
  103.         urlTitle = item[0].replace("\n", "")  
  104.         urlView = item[3].replace("\n", "")  
  105.         urlComments = item[5].replace("\n", "")  
  106.         # 由于匹配时使用了贪婪模式, 为了匹配出现错误,  
  107.         # 将某一篇的标题与另一篇博客的发表时间, 阅读次数或者评论条数混淆的匹配成一篇博客信息  
  108.         # 因此在匹配时,重复的匹配了博客的地址信息  
  109.         # 当且仅当,博客标题附带的地址信息与博客阅读次数以及评论条数附带的地址信息时同一篇博客的地址时,  
  110.         # 我们才认为匹配成功  
  111.         if (urlTitle == urlView) and (urlTitle == urlComments):  
  112.             print "#------------------------------------------------------"  
  113.             print "地址:", item[0].replace("\n", ""),       # 博客地址URL1(标题附带)  
  114.             print "标题:", item[1].replace("\n", ""),         # 博客标题  
  115.             print "时间:", item[2].replace("\n", ""),         # 博客发表时间  
  116.             print "阅读:", item[4].replace("\n", ""),         # 博客阅读次数信息  
  117.             print "评论:", item[6].replace("\n", "")         # 博客评论条数  
  118.             print "#-----------------------------------------------------"  
  119.             print   
  120.             print   
  121.   
  122.   
  123. if __name__ == "__main__" :  
  124.     # 测试正则表达式  
  125.   
  126.     reload(sys)  
  127.     sys.setdefaultencoding("utf-8")  
  128.   
  129.     TestReChinese( )  


转载:http://blog.csdn.net/gatieme/article/details/43275077

目录
相关文章
|
1天前
|
数据采集 安全 JavaScript
【2024-完整版】python爬虫 批量查询自己所有CSDN文章的质量分:附整个实现流程
【2024-完整版】python爬虫 批量查询自己所有CSDN文章的质量分:附整个实现流程
8 0
|
1天前
|
数据采集 JSON API
【2024-简洁版】python爬虫 批量查询自己所有CSDN文章的质量分:方便快速上手修改代码
【2024-简洁版】python爬虫 批量查询自己所有CSDN文章的质量分:方便快速上手修改代码
8 0
|
5天前
|
监控 开发者 Python
Python中记录程序报错信息的实践指南
Python中记录程序报错信息的实践指南
13 1
|
5天前
|
开发者 Python
在Python中查询进程信息的实用指南
在Python中查询进程信息的实用指南
9 2
|
11天前
|
数据可视化 索引 Python
数据分享|Python用PyMC3贝叶斯模型平均BMA:采样、信息准则比较和预测可视化灵长类动物的乳汁成分数据
数据分享|Python用PyMC3贝叶斯模型平均BMA:采样、信息准则比较和预测可视化灵长类动物的乳汁成分数据
|
16天前
|
数据采集 JSON 数据可视化
python_selenuim获取csdn新星赛道选手所在城市用echarts地图显示
python_selenuim获取csdn新星赛道选手所在城市用echarts地图显示
6 1
|
18天前
|
数据安全/隐私保护 Python
Python正则表达式:强大的文本处理工具
Python正则表达式:强大的文本处理工具
11 1
|
21天前
|
Python
Python中的正则表达式以及如何使用它们进行文本处理
正则表达式(Regex)是处理字符串的利器,Python通过`re`模块支持Regex操作,包括匹配模式(`re.match()`),查找模式(`re.search()`),替换内容(`re.sub()`),分割内容(`re.split()`),分组提取(使用括号)以及利用特殊字符创建复杂模式。学习和熟练掌握正则表达式能有效提升文本处理效率。
10 1
|
22天前
|
Python
请解释Python中的正则表达式以及如何使用它们进行文本处理。
正则表达式(Regex)是处理字符串的工具,Python通过`re`模块支持Regex操作,如匹配、查找、替换和分割文本。`re.match()`检查字符串是否以指定模式开始,`re.search()`查找模式,`re.sub()`替换匹配内容,`re.split()`按模式分割字符串。使用括号进行分组提取,特殊字符如`.`、`*`、`+`、`?`、`^`和`$`可创建复杂模式。熟练掌握正则表达式需学习和实践。
11 0
|
23天前
|
Python
python天气预报信息
python天气预报信息