2014年8月

ThinkPHP学习笔记

基础学习:

1.循环输出数组:
<volist name="wiclick_ads" id="vo"> //wiclick_ads 为分配过来的数组 vo 要循环的变量
<eq name="vo.ad_id" value="$ad_id"> //$ad_id 为分配过来的变量
<php>break;</php> //满足相等条件 跳出循环不再继续循环
</eq>
</volist>

2.内置模板引擎输出:
<title>{$wiclick_adb.adb_name}</title>

3.返回:
<a href="javascript:window.history

.back()" class="ht-i">返回</a>

4:将得到的内容提交进行转义(ueditor):
{:htmlspecialchars_decode

($vo['content'])} //执行函数并输出返回值:{:function()}

5.数组索引:{$k}
<volist name="list" id="vo" key="k" >
{$k}.{$vo.name} //若第一条 {$k} 则为1
</volist>

6.assign 标签
<assign name="ad_id" value="$vo['ad_id']"/> //把 value的值给name

6.if标签:
<if condition="($name eq 1) OR ($name gt 100) "> value1
<elseif condition="$name eq 2"/>value2
<else /> value3
</if>
7.php标签:<php>echo 'Hello,world!';</php>

8.比较标签:
<比较标签 name="变量" value="值">内容</比较标签>
<eq name="name" value="value">
value
</eq> 在这里name的值等于value的值就输出

eq或者 equal 等于
neq 或者notequal 不等于
gt 大于
egt 大于等于
lt 小于
elt 小于等于
heq 恒等于
nheq 不恒等于

9.__initialize()
ThinkPHP中的__initialize()的出现只是方便程序员在写子类的时候避免频繁的使用parent::__construct(),同时正确的调用框架内父类的构造器,所以,我们在ThnikPHP中初始化子类的时候要用__initialize(),而不用__construct()

项目注意事项:

1.时间格式化输出:

{$vo.time|date="Y-m-d H:i:s",###}
2.分页(数据采用get方式传值):

①.导入分页类 import('ORG.Util.Page')
②.$count计算条数:->count()
③.加入限制变量:->limit($Page->firstRow.','.$Page->listRows)->select()
3.连贯操作:

M()->field("re.reason_desc,log.ts,w.email,w.nickname,log.to_user,log.remark")
//所要获得的字段
->table(array("wiclickcms_devownship_log"=>"log"))
//要操作的数据表
->join("wiclickcms_admin w on log.from_user=w.aid")
->join("wiclickcms_change_reason re on log.reason=re.reason_id")
//关联其他表
->where("log.dev_id = ".$dev_id)
//查询条件
->order("log.ts desc")
//排序
->limit($page->firstRow,$page->listRows)
//限制条数
->select();

 

4.搜索条件:

①$condition['dev_id']=$dev_id;
$condition['nickname']=array('like','%'.$skey.'%');
②->where($condition)

5.sql别名:

①如果搜出来的列名相同 可以给该冲突列取别名:as 或者" "(空格);
②如果一次查询搜索条件用到同一张表 可以给该冲突的表取不同的别名:as 或者" "(空格);
demo:
//f 和 t 均为wiclickcms_admin的别名
//log 为wiclickcms_devownship_log的别名
//re 为 wiclickcms_change_reason的别名

$where = "re.reason_desc like'$option' and f.nickname like '$f_user' and t.nickname like '$t_user' and log.dev_id='$dev_id'and log.ts >= '$firstTime' and log.ts <='$endTime'";
M()->field('f.nickname as f_name,t.nickname as t_name,log.ts,f.email as f_email,t.email as t_email,log.remark,re.reason_desc')
->table(array("wiclickcms_devownship_log"=>"log"))
->join("wiclickcms_admin f on log.from_user=f.aid ")
->join("wiclickcms_admin t on log.to_user=t.aid ")
->join("wiclickcms_change_reason re on log.reason=re.reason_id ")
->where($where)->count();
在这个demo中,f.nickname 和t.nickname 若不加区分则是同一个列,f和t是同一个表,若不加区分则会报错!

6.通配符"%":
上面那个例子:
$option 改为 %$option% 则当$option 为空时会匹配任意字符对搜索结果没有影响--即不管是否为空。
ps:在作匹配时,至少加上一个 % 才行,并结合like 模糊查询。

7.and 和 or 运算符:
还是上面那个例子:
有六个条件 显然所有条件都要成立 所以用and 连接

爬虫入门笔记

1.urllib的方法?

Python api链接:https://docs.python.org/2/library/urllib.html
经常使用:
a.保存数据到本地
urllib.urlretrieve(url[, filename[, reporthook[, data]]])

b.打开网页
urllib.urlopen(url[, data[, proxies]])

2.urllib2的方法?

python api链接: 贴两个demo:
a.Request

import urllib2
req = urllib2.Request('http://www.example.com/')
req.add_header('Referer', 'http://www.python.org/')
r = urllib2.urlopen(req)

b.Opener

import urllib2
opener = urllib2.build_opener()
opener.addheaders = [('User-agent', 'Mozilla/5.0')]
opener.open('http://www.example.com/')

3.re模块的使用?

对正则表达式的支持。
用法详情参考:http://www.cnblogs.com/huxi/archive/2010/07/04/1771073.html
Python api链接:

4.header的基本要素?

参考:
http://my.oschina.net/abian/blog/131548
http://kb.cnblogs.com/page/92320/

5.正则表达式?

参考:
http://www.cnblogs.com/huxi/archive/2010/07/04/1771073.html

6.python编码规则?

两个单词:
decode:解码-decode('gbk')-已知是gbk解码成Unicode
encode:编码-encode('utf-8')-将unicode编码成utf-8
注意:
①unicode,则需要使用你希望写入的编码进行encode()

②str,则需要先进行decode(),转成unicode后再encode()。

③字符判断方法:isinstance(paramenter,str/unicode)

7.NoneType object?

就是空-none

8.使用lxml的编码注意事项:

先确保html经过了utf-8解码,即code = html.decode('utf-8', 'ignore'),否则会出现解析出错情况。因为中文被编码成utf-8之后变成 '/u2541' 之类的形式,lxml一遇到 “/”就会认为其标签结束。

9.xpath用法?

参考:
http://www.cnblogs.com/descusr/archive/2012/06/20/2557075.html

 

基本爬虫入门-金山词霸

使用lxml进行解析用xpath进行匹配;

整个过程是:假设先输入的单词是“hello",点开链接http://dict-co.iciba.com/api/dictionary.php?key=E0F0D336AF47D3797C68372A869BDBC5&w=hello观察xml结构,再进行解析匹配。

from lxml import etree
import urllib
'''
使用lxml进行解析
调用金山词霸的api进行翻译
'''

下面的代码时调用了金山词霸的api:

key=raw_input("Input a word:\t")

url='http://dict-co.iciba.com/api/dictionary.php?key=E0F0D336AF47D3797C68372A869BDBC5&w='+key

 

这里的函数使用了lxml进行解析并用xpath进行匹配:

defpraserss(html):
'''
findrs为通用代码
只要修改praserss就行了
'''
#解析HTML
root = etree.HTML(html)
#xpath 作匹配
accep=root.xpath(u"//acceptation")
sent=root.xpath(u"//sent")
descr=root.xpath(u"//sent/orig")
trans=root.xpath(u"//sent/trans")
print "\tBasic translations:"+accep[0].text
x=0

for s in sent:

print "\tExmaples"+str(x)+":\t"+descr[x].text,
print trans[x].text,
x+=1

基本爬虫入门-知乎日报

今天开始脚踏实地的认真学起来,网上有人这样写代码,我觉得风格非常格式化,很好于是进行学习。

今天爬的是知乎的rss,在解析方面只是获取了title的内容。

-- coding=utf-8 --

import urllib2,re

'''
基本爬虫入门-知乎日报
'''

defhttpCrawler(url):
'''
网页抓取
'''
content=httpRequest(url)#发送请求
title=parseHtml(content)#解析网页内容 获得title
saveData(title)#存储到本地

def httpRequest(url):
'''
发送请求
'''
try:
page=None#返回请求内容
SockFile=None#中间变量
request=urllib2.Request(url)#使用urllib2模块
request.add_header('User-Agent', 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322)')#添加header 模拟客户端
request.add_header('Pragma', 'no-cache')
opener=urllib2.build_opener()
SockFile=opener.open(request)
page=SockFile.read()

finally:
if SockFile:
SockFile.close()

return page

def parseHtml(html):
'''
解析网页内容
'''
result=""
content=""
pattern=r'<title>(.+?)</title>'#正则表达式匹配
temp = re.compile(pattern)
temp=re.findall(temp,html)#temp为list-列表
article=temp[0]
x=0

for title in temp:

if x!=0:

string=str(x)+"."
string+=title.decode('utf-8').encode('gbk')
#将unicode译码为utf-8编码 再转gbk在cmd下显示
content+=string
x+=1

result=article.decode('utf-8').encode('gbk')+content

return result

def saveData(data):
'''
存储到本地
'''
f=open('test.txt','w') #写二进制
f.write(data)
f.close()

if name=='main':#如果运行的是主程序
url='http://zhihu.com/rss'#要爬的网页
httpCrawler(url)

 

基本爬虫入门-图片下载

从网上找了一个例子进行爬虫的入门,自己进行了修改之后把代码贴了上来,只是使用了urllib模块和正则进行匹配,就能下载.jpg。试过用来批量下载图虫的图片很轻松。并且已经用py2.exe转成直接可以运行的程序。

-- coding: utf-8 --

import urllib
import re

def getHtml(url):

page = urllib.urlopen(url)
html = page.read()
return html

def getImg(html):

reg = r'src="(.+?\.jpg)"' #匹配src=" .jpg"
imgre = re.compile(reg)
imglist = re.findall(imgre,html)#匹配后返回列表
x = 1
for imgurl in imglist:

urllib.urlretrieve(imgurl,path+prefix+'_%s.jpg' % x)
x+=1
print "图片"+str(x)+"已经下载!"

# 图片已经下载返回提示

print str(x-1)+"张图片全部下载完!"

url

html = getHtml(raw_input("请输入图片下载的网址:\n"))

path

path=raw_input("请输入图片存放目录:\n")+'\'
prefix=raw_input("请输入图片文件的前缀名:\n")
getImg(html)