使用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

目录
相关文章
|
数据采集 监控 数据安全/隐私保护
Python正则表达式:用"模式密码"解锁复杂字符串
正则表达式是处理字符串的强大工具,本文以Python的`re`模块为核心,详细解析其原理与应用。从基础语法如字符类、量词到进阶技巧如贪婪匹配与预定义字符集,结合日志分析、数据清洗及网络爬虫等实战场景,展示正则表达式的强大功能。同时探讨性能优化策略(如预编译)和常见错误解决方案,帮助开发者高效掌握这一“瑞士军刀”。最后提醒,合理使用正则表达式,避免过度复杂化,追求简洁优雅的代码风格。
320 0
|
存储 算法 API
【01】整体试验思路,如何在有UID的情况下获得用户手机号信息,python开发之理论研究试验,如何通过抖音视频下方的用户的UID获得抖音用户的手机号-本系列文章仅供学习研究-禁止用于任何商业用途-仅供学习交流-优雅草卓伊凡
【01】整体试验思路,如何在有UID的情况下获得用户手机号信息,python开发之理论研究试验,如何通过抖音视频下方的用户的UID获得抖音用户的手机号-本系列文章仅供学习研究-禁止用于任何商业用途-仅供学习交流-优雅草卓伊凡
2877 82
|
10月前
|
API Python
VIN码查询API的实战指南:获取二手车信息以Python为例
随着机动车保有量上升,中国二手车市场迎来发展机遇。本文介绍如何通过VIN码查询API获取车辆详细信息,提升交易透明度与安全性。
375 1
|
9月前
|
前端开发 数据安全/隐私保护 Python
虚拟物流单号生成器, 虚拟快递单号假物流信息, 虚拟快递单号在线生成【python框架】
这个虚拟物流单号生成系统包含以下功能:支持多种主流快递公司的单号生成
|
9月前
|
数据安全/隐私保护 数据格式 Python
快递单号模拟生成器, 虚拟物流信息在线生成,虚假快递单号生成器【python】
支持多种主流快递公司生成符合各快递公司规则的快递单号自动生成收发件人信息
|
9月前
|
JSON 前端开发 API
快递单号生成器在线, 快递单号模拟生成器, 虚拟物流信息在线生成【python】
项目包含三个主要模块:快递单号生成器核心逻辑、Flask Web应用程序和前端HTML页面
|
9月前
|
JSON API 数据安全/隐私保护
车辆五项信息查询 API 的实践指南:通过Python调用赋能车辆信息标准化
本API通过车牌号快速获取车辆五项核心信息,包括品牌、登记日期、车架号等,助力二手车评估、维修、保险等场景实现数字化转型。数据源自权威公安交管库,日更同步,毫秒级响应,满足高并发需求,符合隐私保护规范,是推动汽车后市场智能化的重要工具。
600 0
|
10月前
|
数据采集 存储 数据可视化
Python爬取招标信息并生成可视化分析报告
Python爬取招标信息并生成可视化分析报告
|
存储 监控 API
【Azure App Service】分享使用Python Code获取App Service的服务器日志记录管理配置信息
本文介绍了如何通过Python代码获取App Service中“Web服务器日志记录”的配置状态。借助`azure-mgmt-web` SDK,可通过初始化`WebSiteManagementClient`对象、调用`get_configuration`方法来查看`http_logging_enabled`的值,从而判断日志记录是否启用及存储方式(关闭、存储或文件系统)。示例代码详细展示了实现步骤,并附有执行结果与官方文档参考链接,帮助开发者快速定位和解决问题。
338 22
|
JavaScript API C#
【Azure Developer】Python代码调用Graph API将外部用户添加到组,结果无效,也无错误信息
根据Graph API文档,在单个请求中将多个成员添加到组时,Python代码示例中的`members@odata.bind`被错误写为`members@odata_bind`,导致用户未成功添加。
203 10

推荐镜像

更多