使用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天前
|
Python
Python使用正则表达式分割字符串
在Python中,你可以使用re模块的split()函数来根据正则表达式分割字符串。这个函数的工作原理类似于Python内置的str.split()方法,但它允许你使用正则表达式作为分隔符。
|
1天前
|
JavaScript 关系型数据库 MySQL
Python实战:从猎聘网获取职位信息并存入数据库
Python实战:从猎聘网获取职位信息并存入数据库
|
4天前
|
SQL 算法 数据挖掘
leetCode第十题 : 正则表达式匹配 动态规划【10/1000 python】
leetCode第十题 : 正则表达式匹配 动态规划【10/1000 python】
|
6天前
|
存储 供应链 开发者
Python列表打造简易进销存系统:轻松管理库存信息!
Python列表打造简易进销存系统:轻松管理库存信息!
|
6天前
|
Java 程序员
JavaSE——正则表达式(2/2):应用案例、查找信息、用于搜索替换、分割内容
JavaSE——正则表达式(2/2):应用案例、查找信息、用于搜索替换、分割内容
7 0
|
6天前
|
数据采集 监控 Python
Python新手必看:正则表达式入门到精通只需这一篇!
了解 Python 中的正则表达式,用于高效处理字符串。导入 `re` 模块,用 `r` 前缀避免转义困扰。示例:`re.split` 切分字符串,`re.findall` 进行匹配与查找,数量词如 `*`, `+`, `?` 控制匹配次数,边界匹配定位开始或结束。使用 `group` 和 `sub` 进行组合操作,解决复杂文本处理问题。正则表达式是字符串处理的利器,助你轻松应对各种场景。
8 0
|
7天前
|
数据库 C++ 索引
Python 正则表达式
Python 正则表达式
|
9天前
|
机器学习/深度学习 缓存 固态存储
11.Python 正则表达式
11.Python 正则表达式
23 0
|
9天前
|
数据库 Python
Python网络数据抓取(8):正则表达式
Python网络数据抓取(8):正则表达式
15 2
|
10天前
|
Python
Python中re模块的正则表达式
【6月更文挑战第2天】了解Python的re模块,它是处理正则表达式的核心工具。正则表达式用于在文本中查找特定模式。本文讨论了re模块的用法和技巧,包括导入模块、匹配、分组、替换文本、编译正则表达式以及使用预定义字符类、量词、锚点等高级功能。通过实例展示了如何在Python中执行这些操作,帮助提升文本处理能力。掌握这些技巧将使你更有效地利用正则表达式解决字符串处理问题。
10 2