- 论坛徽章:
- 0
|
本帖最后由 Tinylamb 于 2012-03-20 13:26 编辑
事情从这个帖子开始。
原来以为是一件很简单的事情,但随着增加新的要求,深入到细节,要解决问题、要查阅的资料也随之增多。
在这里记录思考的过程,与大家分享。
######
原贴中,感谢mozillazg指出了一个错误。修正后,程序可以发出搜索请求了,也尝试下载了一些内容(暂不保证是关键标题)。打开下载文本一看,
Fucking my life.全是乱码。问题来了,如何将BeautifulSoup抽取的内容保存为中文?
从这里,了解到一些关于编码、解码的知识。解释的很清楚,这里不复述了。
这里有一点体会:
知识的结构就像是一棵树,知识树的顶端结点少,而且都是一些基本原理。越往知识树的底层次走,结点越多,相对的也是一些由基本原理引申出来的东西。
为什么我们会觉得要学习的东西很多,而且多半是浅尝辄止。感觉自己什么都学了,都仔细一想,好像又什么都没学着。产生这样的感觉,大概就是因为我们
总停留在处理细节的问题,而没有通过底层众多的细节向上总结出本质。知1知2,不知其3。
回到编码的问题,找个时间读一下Joel的这篇文章,对编码的知识就更清楚了。
#####
解决了编码问题,程序能保存中文了。打开保存的文本再一看,
Fucking my life ,全不是我想要的。这个就是BeautifulSoup的基本功了。将网页作为一个树结构,如何通过标签与属性定位想要的内容。
这里有几点是可以总结的:
1.化繁为简
如果有个事情要重复做多遍,不如先选取一遍来做好(细节的处理)。
不是每个人一开始就能想出一个完整的大程序。
2.Debug利用 Try ... Except...定位错误源。
在Except中,将抛出异常的地方保存下来,再分析为什么它会抛出异常。
3.资料的获取
这段时间觉得stackoverflow是个好地方,除了获取资料,也可以学会如何用英文提问。
#####
完整的程序如下,下一步会完善GUI- def search(key):
- import urllib2
- import BeautifulSoup
- #observe the pattern of search url
- search_url='http://www.baidu.com/s?wd=key&rsv_bp=0&rsv_spt=3&rsv_n=2&inputT=6391'
- # search your keyword
- req=urllib2.urlopen(search_url.replace('key',key))
- keyword=[] #store result
- print 'loading. . .'
- for count in range(10):#search for 10 pages
- print 'load page:{}'.format(count+1)
- html=req.read()
- soup=BeautifulSoup.BeautifulSoup(html.decode('gb2312','ignore')) #html.decode('gb2312','ignore') is needed
- result=[i.contents for i in soup('a',{'onmousedown':True,'target':'_blank'})]
- for r in result:
- k=[]
- for i in r:
- if isinstance(i,BeautifulSoup.NavigableString):
- k.append(i)
- else:
- item=[item.string if isinstance(item,BeautifulSoup.Tag) else item for item in i.contents if i.contents] #List comprehension
- k.append(''.join([i for i in item if i])) #item may include NoneType . ''.join([...,None,...]):TypeError
- keyword.append(''.join(k))
- next_page='http://www.baidu.com/'+soup('a',{'href':True,'class':'n'})[0]['href'] # search for the next page 'http:www.baidu.com/' should be 'http://www.baidu.com/'
- req=urllib2.urlopen(next_page)
- f=open(r'C:\Users\Tinylamb\Desktop\result.txt','w')
- for k in keyword:
- data=k.encode('gb2312','ignore')
- f.write(data+'\n')
- f.close()
- print 'ok!'
- if __name__=='__main__':
- key=raw_input('input key word:')
- search(key)
复制代码 |
|