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

目录
相关文章
|
11天前
|
数据安全/隐私保护 Python
python之自动化进入CSDN
python之自动化进入CSDN
17 0
|
2天前
|
存储 数据采集 数据库
用 Python 爬取淘宝商品价格信息时需要注意什么?
使用 Python 爬取淘宝商品价格信息时,需注意法律和道德规范,遵守法律法规和平台规定,避免非法用途。技术上,可选择 Selenium 和 Requests 库,处理反爬措施如 IP 限制、验证码识别和请求频率控制。解析页面数据时,确定数据位置并清洗格式。数据存储可选择 CSV、Excel、JSON 或数据库,定期更新并去重。还需进行错误处理和日志记录,确保爬虫稳定运行。
|
2天前
|
数据采集 Web App开发 iOS开发
如何利用 Python 的爬虫技术获取淘宝天猫商品的价格信息?
本文介绍了使用 Python 爬虫技术获取淘宝天猫商品价格信息的两种方法。方法一使用 Selenium 模拟浏览器操作,通过定位页面元素获取价格;方法二使用 Requests 和正则表达式直接请求页面内容并提取价格。每种方法都有详细步骤和代码示例,但需注意反爬措施和法律法规。
|
18天前
|
Python
Python 中常用的内置模块之`re`模块
【10月更文挑战第11天】 `re` 模块是 Python 内置的正则表达式处理工具,支持模式匹配、搜索、替换等功能。通过 `search`、`match`、`findall` 和 `sub` 等函数,结合正则表达式的元字符、分组、贪婪模式等特性,可高效完成文本处理任务。示例代码展示了基本用法,帮助快速上手。
14 1
|
22天前
|
Python
【收藏备用】Python正则表达式的7个实用技巧
【收藏备用】Python正则表达式的7个实用技巧
18 1
|
26天前
|
数据安全/隐私保护 Python
Python实用正则表达式归纳
Python实用正则表达式归纳
16 3
|
26天前
|
小程序 Python
利用Python编程提取身份证的信息
利用Python编程提取身份证的信息
18 2
|
5天前
|
缓存 监控 Linux
Python 实时获取Linux服务器信息
Python 实时获取Linux服务器信息
|
18天前
|
Python
Python实现系统基础信息
Python实现系统基础信息
27 0
|
23天前
|
JavaScript 前端开发 Scala
Python学习十:正则表达式
这篇文章是关于Python中正则表达式的使用,包括re模块的函数、特殊字符、匹配模式以及贪婪与非贪婪模式的详细介绍。
14 0