Python 正则表达式应用实例--天涯帖子的“只读楼主”功能的实现

  天涯在线是我国最大的论坛社区,无论论坛的在线人数、帖子质量数量,其他论坛都难以望其项背。
  以天涯旅游版为例,一个质量稍微好一点的帖子,其长度约有10余页,2000多个楼主发帖和其他用户的回复。很多时候,回复的内容中很多是垃圾留言,甚至是无关的广告帖子。
  这里开发一个网页过滤器对天涯帖子进行过滤,处理后的帖子只剩下楼主的跟帖。
 
  主要使用python的正则表达式来实现网页元素的识别、替换和删除。
 
   结果在这里演示:
   测试例子: [url]http://www.tianya.cn/publicforum/content/travel/1/191157.shtml[/url]
   python cgi地址: [url]http://laiba.appspot.com/lz[/url] (google的apps engine)
   演示URL   [url]http://laiba.appspot.com/lz?url=http://www.tianya.cn/publicforum/content/travel/1/165289.shtml[/url]
 
   过滤的原理为,让 [url]http://laiba.appspot.com/lz[/url]对 [url]http://www.tianya.cn/publicforum/content/travel/1/191157.shtml[/url]进行访问,分析其html源码输出,将非楼主部分的回帖剔除掉。同时,帖子上如果有分页,则对分页按钮的目标href进行替换;如果帖子上有表单form,则分析表单字段,改变表单的target为 [url]http://laiba.appspot.com/lz[/url] 脚本。
  
  处理的主要过程为:
 
  1.识别楼主:
 
   帖子代码片段:
< ! -- 天涯百宝箱 -- >
< script >
var chrType = "public";
var intAuthorId = "";
var chrAuthorName = "GreyHouse";
var chrTitle = "[光影记录]跳蚤的欧洲之行";
var chrItem = 'travel';
var intItem = '0';
var intArticleId = "191157";
var tAuthor = 'GreyHouse';
</script>
 
  使用以下的正则表达式来找到楼主
   reg_louzhu = re.compile('.*chrAuthorName = "(.*?)"; '
   
  设mat为reg_louzhu.match(网页源码html行);
  则mat.groups()[0] 为楼主名字 GreyHouse
 
2. 识别一个帖子的起始位置
   继续分析html,发现天涯回帖一般都是用作者信息栏作为帖子的起始,那么帖子的尾部就是下一个作者信息栏之前咯。
< TABLE cellspacing=0 border=0 bgcolor=f5f9fa width=100% > < TR > < TD WIDTH=100 ALIGN=RIGHT VALIGN=bottom > </TD> < TD > < font size=-1 color=green > < br > < center >作者: < a href ="/browse/Listwriter.asp?vid=11288815&vwriter=开着坦克逛街&idwriter=0&key=0"     target=_blank >开着坦克逛街 </a> 回复日期:2009-1-8 14:32:38 </font>  </center> </TD> < TD WIDTH=100 ALIGN=RIGHT VALIGN=bottom >  </TD> </TR> </table>
 
使用如下表达式来识别作者信息栏和作者的位置:
pat_vwriter=re.compile(r".*<TABLE.*vwriter=(.*).idwriter")
 
同理,match对象的grous()[0] 是回复作者。
 
如果发现匹配,就可以得到回帖作者的名字以及回帖的起始位置。
后续的处理为:
        如果回帖作者是楼主,那么连续输出其回帖内容
        如果回帖作者非楼主,删除其回帖内容
 
3. 实现分页按钮href替换
 
  帖子上有分页功能的按钮,如果不处理,那么点击分页后又会跳回原天涯页面上。所以,这里要做到识别分页href连接,然后替换这个连接。
  分页功能按钮的href相关源码如下:
< a    href=http://www.tianya.cn/publicforum/content/travel/1/166458.shtml > < font color=#246cae >下一页 </a>
  正则表达式 pnext=re.compile("<a *href=([^>]*?)><font[^>]*>下一页</a>")
  使用
filtered_html    = pnext.sub(r" < a href=http://laiba.appspot.com/lz?url=\1 > < font color=#246cae >下一页 </font> </a>",filtered_html)    
 
 其中\1表示正则表达是匹配后,匹配结果中的组1,既是 :[url]http://www.tianya.cn/publicforum/content/travel/1/166458.shtml[/url]
  上述替换的结果为,把 原来
< a    href=http://www.tianya.cn/publicforum/content/travel/1/166458.shtml > < font color=#246cae >下一页 </a>
换成了
< a    href=http://laiba.appspot.com/lz?url=http://www.tianya.cn/publicforum/content/travel/1/166458.shtml > < font color=#246cae >下一页 </a>
 
这样就实现的连接的重新替换。
 
4 form对象的替换。
 
  和连接href对象的替换类似,也是使用睁着表达式来识别 <form>....</form>这样的元素,然后把部分表单元素或者整个表单替换掉,从而实现自己的目的。
 
  有兴趣的读者可以进行选择一个html页面,用正则表达式进行过滤,实现自己喜欢的功能。
  一般功能有:
  网络钓鱼:
  1. 选取一个银行网站,分析其关键部分(登陆)部分的Form。
  2. 用自己网站上的脚本进行处理,将其Form部分重定向到自己网站上。
  3. 申请和银行类似的域名,伪装链接并将链接发送给水鱼。
  这样做效果比建立一个钓鱼网站所花的功夫可能要少,而且还会随着目标网站的更新而更新(因为都是从目标直接拉取页面)。缺点是url可能比较长,容易引起怀疑。
  广告去除:
  分析广告特征html代码,将广告部分去掉。
 
  Google appengine 支持用户申请500M的网页空间,允许在上面运行python脚本,并提供相应的URL、数据存储、图片处理的API。方便学习者在上面创建各种有意思的应用。如感兴趣请访问 [url]http://code.google.com/intl/zh-CN/appengine/docs/whatisgoogleappengine.html[/url],申请方便,只要你拥有一台联通号码的手机用于接收验证短信即可。
  随后附上我google apps上的天涯html过滤脚本。
 

你可能感兴趣的:(python,正则表达式,钓鱼,天涯,只读楼主,广告去除)