我的第一个Python程序


刚学写python编程,就写个程序练练,用来保存雅虎博客文章的。第一次用python,觉得python没有传说中那么容易学容易写,写个程序都弄到头都大了:(
共3个文件
一个是dive into python里的urllister.py
blog.py:
#!/usr/bin/python
#-*-coding:utf-8-*-
#用来保存网页blog

"""
备份yahoo博客   作者:trouble.li
	blog [userName] [directory]

	userName:博客用户名称,即如果邮箱是 abc@yahoo.com.cn,则userName就是abc
	directory指定下载页面存放的路径
	程序按文章分类来下载页面,并为每一个类别建立文件夹

	参考了http://zeroliu.blogdriver.com/zeroliu/1189130.html
"""

import xmlrpclib
import os.path
import os
import codecs
import traceback
import urllib,urllib2,urllister
from HTMLParser import HTMLParser
from htmlentitydefs import *
import sys
from myhtml import myParser2
from myhtml import myParser3
from myhtml import myParser4

#初始化一些变量,要修改
usr='trouble.li'
dir='/home/trouble/python/'
urlBase='http://i.cn.yahoo.com/'
encoding='gb2312'
preUrl='' #保存前一url
catagory={}

#cd函数用于判断路径是否正确,如正确则改变当前工作路径
def cd(ss):
	try:
		os.chdir(ss)
		print '改变工作目录为'+ss
		return 0
	except:
		print '保存路径有误,请重新输入'
		return 1
	

#保存URL到一个文件,返回html
def saveUrlToFile(url,filename):
	#访问URL
	usock=urllib.urlopen(url)
	html=usock.read()
	usock.close()

	#以title作为文件名
	if filename=='':
		htmlpaser=myParser2()
		htmlpaser.feed(html)
		filename=htmlpaser.title.split('_')[0]
		#print '以title作为文件名,title:'+htmlpaser.title
		htmlpaser.close()
	
	#保存文件
	fp=file(filename,'wb')
	fp.write(html)
	fp.close();

	print 'saveUrl(%s) to File %s'%(url, filename)

	#返回
	return html

#对url进行筛选
def addUrl(url,blogs):
	if '/blog/p' in url and '#' not in url: # and '?' not in url:
		global preUrl
		if preUrl==url:return #避免保存同一个页面多次
		preUrl=url
		blogs.append(url)
		print '增加一篇文章:'+url
		
#取得博客文章分类
def getCategory():
	usock=urllib.urlopen(urlBase)
	html=usock.read()
	usock.close()
	
	htmlparser=myParser3()
	htmlparser.feed(html)
	catagory.update(htmlparser.cata)

#取得某分类所有文章链接
def getAllUrl(l_parser,blogs):
	l_url={}
	for url in l_parser.urls:
		if '/blog/l_' in url:
			usock=urllib.urlopen(url+'&bv=t') #bv=t:表示标题模式
			html=usock.read()
			usock.close()
			
			htmlparser=myParser4()
			htmlparser.url.clear() #为什么一定要这句?
			htmlparser.feed(html)
			l_url.update(htmlparser.url)
		else:
			addUrl(url,blogs)
	
	for url in l_url.values():
		blogs.append(url)
		print '增加一篇文章:'+url

if __name__=='__main__':
	if sys.argv[1:]:usr=sys.argv[1]
	if sys.argv[2:]:dir=sys.argv[2]
	dir=dir+usr+'-yahoo'
	urlBase=urlBase+usr+'/blog/'
	#保存目录
	if not os.path.exists(dir):
		print dir
		os.mkdir(dir)
	cd(dir)
	
	#catalogs={}
	#pages=[1,11,21,31]
	#for i in pages:
	#	catalogs['l_'+repr(i)+'/']='0摘要页面'+repr(i)
	
	#通过分类来整理
	count=0
	getCategory()
	for cata in catagory.keys():
		#print cata
		#html=saveUrlToFile(urlBase+cata,"0分类-"+catagory[cata])

		#为每一个分类创建一个目录
		tempdir=dir+'/'+catagory[cata]
		if not os.path.exists(tempdir):
			print tempdir
			os.mkdir(tempdir)
		cd(tempdir)
		usock=urllib.urlopen(urlBase+cata+'&bv=t') #bv=t:表示标题模式
		html=usock.read()
		#count+=1
		parser=urllister.URLLister()
		parser.feed(html)
		parser.close()

		#每一个分类可能有多页

		count1=0
		blogs=[]
		#取出这个分类的所有文章链接放到blogs里
		getAllUrl(parser,blogs)

		for url in blogs:
			saveUrlToFile(url,'')
			count+=1
			count1+=1

		print '/n----本类别有 %d 篇文章/n' %(count1)

	print '/n----Finished! Total %d posts be saved ' %(count)
myhtml.py:
#coding:utf-8
import HTMLParser
from sgmllib import SGMLParser

#处理html内容
class myParser(HTMLParser.HTMLParser):
	is_title=''
	title=''
	def __init__(self):
		HTMLParser.HTMLParser.__init__(self)
		
	def handle_starttag(self,tag,attrs):
		#重新定义处理标签函数
		if tag=='title':
			self.is_title=1
	
	def handle_endtag(self,tag):
		if tag=='title':
			self.is_title=''
	
	def handle_data(self,data):
		if self.is_title:
			self.title=data
			print data;
			
class myParser2(SGMLParser):
	"""
	用于处理网页title
	"""
	is_title=''
	title=''
			
	def start_title(self,attrs):
		#重新定义处理标签函数
		self.is_title=1
	
	def end_title(self):
		self.is_title=''
	
	def handle_data(self,text):
		if self.is_title:
			#text=text.decode('gb2312','ignore').encode('utf-8')
			self.title=text
			#print text;
					
class myParser3(SGMLParser):
	"""
	用于处理标签
	"""
	is_cata=''
	cata={}
	href=''
	
	def handle_data(self,text):
		if self.is_cata:
			#获得分类名称
			print text
			self.href=self.href.split('/')[-1]
			self.cata[self.href]=text
			self.is_cata=''
			self.href=''
	def start_a(self,attrs):
		for tuples in attrs:
			if tuples[0]=='href':
				if "/blog/?sc" in tuples[1]:
					print '找到一个分类:'
					self.is_cata=1
					self.href=tuples[1]  #获得分类的url
					
class myParser4(SGMLParser):
	"""
	用于处理标签
	"""
	url={}
	
	def start_a(self,attrs):
		for tuples in attrs:
			if tuples[0]=='href':
				if "/blog/p" in tuples[1] and '#' not in tuples[1]:# and '?' not in tuples[1]:
					temp=tuples[1].split('/')[-2]
					#print 'temp',temp
					self.url[temp]=tuples[1]  #获得分类的url

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值