阳神 发布的文章

Markdown简单语法

1.综述

Markdown 的语法全由一些符号所组成,这些符号经过精挑细选,其作用一目了然。比如:在文字两旁加上星号,看起来就像强调。Markdown 的列表看起来,嗯,就是列表。Markdown 的区块引用看起来就真的像是引用一段文字,就像你曾在电子邮件中见过的那样。

2.兼容html

markdown的语法目标是成为一种网络的书写语言。
markdown语法种类很少,只对应HTML语言的一小部分,不在markdown覆盖范围内的标签都可以直接在文档里面用HTML书写。不需要额外标准这是HTML还是Markdown。
需要注意的是HTML标签间的Markdown语法是不会被处理的。但是在Markdown语法之间的HTML语法是会被处理的。
###2.1特殊字符自动转化
在html中有两个需要特殊注意的字符<和&,如果要原样输出需要&lt;&amp;。但是在Markdown中直接原样输出即可。写成&lt;或者&amp;会和HTML中的一样效果。

3.区块元素

3.1标题

markdown支持两种形式的标题。
一种是利用=(第一阶标题)和-(第二阶标题),例如

这是第一阶标题
======
这是第二阶标题
------

任何数量的=-效果都一样,但是写=-所在行不能出现别的符号和文字

另外一种是在行收插入1到6个#,对应标题1到6阶,例如:

#这是一级标题
##这是二级标题
###这是三级标题

3.2区块标记

Markdown标记区块是使用>的方式,在每行的最前面加上>(最好动手试一下看结果)。
Markdown也允许你偷懒在每一个段落的第一行最前面加上>,允许换行,只要中间不插入空行,就算是一个区块的内容:

>我是一块内容我是一块内容我是一块内容我,是一块内容我是一块内容我是一块内容我是
一块内容我是一块内容

区块还可以嵌套,只要根据层次加上不同数量的>

>我能够嵌套我能够嵌套我能够嵌套我能够嵌套我能够嵌套我能够嵌套我能够嵌套
>我能够嵌套我能够嵌套我能够嵌套我能够嵌套我能够嵌套
>>我能够嵌套我能够嵌套我能够嵌套我能够嵌套
>我能够嵌套我能够嵌套我能够嵌套
>我能够嵌套我能够嵌套我能够嵌套

引用的区块内还可以使用其他的Markdown语法,包括标题、列表、代码块等:

> ## 这是一个标题。
>
> 1.   这是第一行列表项。
> 2.   这是第二行列表项。
>
> 给出一些例子代码:
>
>     return shell_exec("echo $input | $markdown_script");

3.3列表

Markdown 支持有序列表和无序列表。

无序列表使用星号、加号或是减号作为列表标记:

* aaa
* bbb
* ccc

等同于:

+ aaa
+ bbb
+ ccc

也等同于:

- aaa
- bbb
- ccc

有序列表则使用数字连着一个内容数字和内容之间要有空格隔开:

1. first
2. scond
3. third

重要的一点是你在有序列表里面改变行首的数字(不是第一行),不会影响输出结果。上面那个列表和下面这个列表等同:

1. first
3. second
9. third

所以在写有序列表的时候你只需要标记一下第一行的数字就行,后面的数字完全不用在意。
如果要在列表里面引用区块,为了美观最好缩进两个空格。

1. aaa
2. bbb
2. sdad
   > dasdasd

列表内容还能嵌入代码块,不过嵌入代码块要有一个空行,然后在首行缩进八个空格或者两个制表符(这得看你的编辑器设置的一个制表符等于几个空格)

1. 代码示例:

        return a+b

当然有时候写文档还会遇见这种写法:

1937. 中日战争爆发。

Markdown也会默认把它当成列表。换句话说只要行首出现数字+句点+空白,都会被Markdown识别为列表,为了避免这种情况,你可以在句点前面加上反斜杠:

1937\. 中日战争爆发

###3.4代码区块
写文档的时候有时候会有已经排班好的代码区块,通常我们不希望它以段落的形式去排版,而是显示原来的样子。
第一种方法是只要简单地缩进 4 个空格或是 1 个制表符就可以,代码快前面要有一个空行。一个代码区块会一直持续到没有缩进的那一行(或是文件结尾)。

这是一个普通段落:

    这是一个代码区块。

第二张方法就是成对出现'''(这个是数字1前面那个符号不是单引号):

'''
这是一个代码区块
'''

3.5分割线

你可以在一行中用三个以上的星号、减号、底线来建立一个分隔线,行内不能有其他东西。你也可以在星号或是减号中间插入空格。下面每种写法都可以建立分隔线:

* * *

***

*****

- - -
_ _ _
------------------------------------

3.6链接

Markdown 支持两种形式的链接语法: 行内式和参考式两种形式。

不管是哪一种,链接文字都是用 [方括号] 来标记。

要建立一个行内式的链接,只要在方块括号后面紧接着圆括号并插入网址链接即可,如果你还想要加上链接的 title 文字(鼠标浮动到链接上显示的文字),只要在网址后面,用双引号把 title 文字包起来即可,例如:

这是[百度](http://www.baidu.com "百度")的链接

如果你是要链接到同样主机的资源,你可以使用相对路径:

See my [About](/about/) page for details.

参考式的链接是在链接文字的括号后面再接上另一个方括号,而在第二个方括号里面要填入用以辨识链接的标记:

这是[百度][百度]的链接

接着,在文件的任意处,你可以把这个标记的链接内容定义出来:

[百度]:http://www.baidu.com

链接内容定义的形式为:

  • 方括号(前面可以选择性地加上至多三个空格来缩进),里面输入链接文字
  • 接着一个冒号
  • 接着链接的网址
  • 选择性地接着 title 内容,可以用单引号、双引号或是括弧包着
  • 前面必须要有一个空行

网址定义只有在产生链接的时候用到,并不会直接出现在文件之中。

链接辨别标签可以有字母、数字、空白和标点符号,但是并不区分大小写,因此下面两个链接是一样的:

[百度][a]
[百度][A]

隐式链接标记功能让你可以省略指定链接标记,这种情形下,链接标记会视为等同于链接文字,要用隐式链接标记只要在链接文字后面加上一个空的方括号,如果你要让 "Google" 链接到 google.com,你可以简化成:

[google][]

然后定义链接内容:

[google]:http://google.com

3.7强调

Markdown使用*_作为标记强调字词的符号,被一个*或者_包围的字体会变成斜体,用两个包起来会变成加粗。用三个会变成加粗的斜体。再多就会原样输出。例如:

*a*
**a**
***a***
____a____

会变成
a
a
a
a
你可以随便用你喜欢的样式,唯一的限制是,你用什么符号开启标签,就要用什么符号结束。
你还可以在文字中间加强调:

我是一个粉刷匠,粉刷**能力强**

如果要在文字前后直接插入普通的星号或底线,你可以用反斜线:

\*我是一个粉刷匠,粉刷能力强\*

3.8图片

图片使用atom的Markdown-img-paste插件既可以截图粘贴插入了,Mac下面的粘贴是Ctrl+v,Windows下的粘贴图片是Ctrl+Shift+v.

python操作数据库(三)数据库操作类的封装

观察前面的操作可以发现,python操作数据库除了sql语句及参数不同,其它语句都是一样的,为了避免重复造轮子,我们可以封装一个数据库操作类来简化我们的数据库操作。具体步骤如下
创建MysqlHelper.py文件,定义类
import pymysql
import pymysql.cursors

class MysqlHelper():
def init(self,host,db,user,passwd):
self.host=host
self.db=db
self.user=user
self.passwd=passwd

def connect(self):
    self.conn=pymysql.connect(host=self.host,db=self.db,user=self.user,passwd=self.passwd)
    self.cursor=self.conn.cursors()

def close(self):
    self.cursor.close()
    self.conn.close()

def get_one(self,sql,params=()):
    result=None
    try:
        self.connect()
        self.cursor.execute(sql, params)
        result = self.cursor.fetchone()
        self.close()
    except Exception as e:
        print(e.message)
    return result

def get_all(self,sql,params=()):
    list=()
    try:
        self.connect()
        self.cursor.execute(sql,params)
        list=self.cursor.fetchall()
        self.close()
    except Exception as e:
        print(e.message)
    return list

def insert(self,sql,params=()):
    return self.__edit(sql,params)

def update(self, sql, params=()):
    return self.__edit(sql, params)

def delete(self, sql, params=()):
    return self.__edit(sql, params)

def __edit(self,sql,params):
    count=0
    try:
        self.connect()
        count=self.cursor.execute(sql,params)
        self.conn.commit()
        self.close()
    except Exception as e:
        print(e.message)
    return count

添加

创建testInsertWrap.py文件,使用封装好的帮助类完成插入操作
#encoding=utf8
from MysqlHelper import *

sql='insert into students(sname,gender) values(%s,%s)'
sname=input("请输入用户名:")
gender=input("请输入性别,1为男,0为女")
params=[sname,bool(gender)]

mysqlHelper=MysqlHelper('localhost','test1','root','mysql')
count=mysqlHelper.insert(sql,params)
if count==1:
print('ok')
else:
print('error')
查询一个

创建testGetOneWrap.py文件,使用封装好的帮助类完成查询最新一行数据操作
#encoding=utf8
from MysqlHelper import *

sql='select sname,gender from students order by id desc'

helper=MysqlHelper('localhost','test1','root','mysql')
one=helper.get_one(sql)
print(one)

python操作数据库(二)SQL语句参数化及防SQL注入

我们在做数据库开发过程中如果一不小心就会留下一些漏洞给别人留下可趁之机比如下面的代码:

import pymysql
import pymysql.cursors

conn=pymysql.connect(host="localhost",user="root",passwd="mysql",port=3306,db="studet")

cursor1=conn.cursors()

tem=input("请输入要查询的名字:")
sql = "select * from user where name=%s"%tem
cursor1.execute(sql)
a=cursor1.fetchall()
print(a)
conn.close()

代码本来的意思是根据输入的学生名字获得对应学生的详细信息,但是有的有人会利用代码的漏洞,比如下图img4.png

就能跳过要输入的name,直接获取所有信息,当这种方法被用到用户的登陆时,后果是可怕的。

python的数据库操作提供了参数化这个功能,只需要对代码进行一点微小的修改,就能有效避免这种结果,还能不影响他的真实效果。修改如下:
import pymysql
import pymysql.cursors

conn=pymysql.connect(host="localhost",user="root",passwd="mysql",port=3306,db="studet")

cursor1=conn.cursors()

tem=input("请输入要查询的名字:")
sql ="select * from user where name=%s"
cursor1.execute(sql,tem)
a=cursor1.fetchall()
print(a)
conn.close()

再次输入SQL注入语句就会得到下面的结果:
img6.png
这样就能很好的屏蔽掉了SQL注入!

python操作数据库(一)

做开发,肯定离不开数据存储,数据存储就肯定离不开数据库,我们今天就介绍一下python操作数据库。
需要的工具
1.python3.5
2.pycharm
3.mysql数据库(首先要下载一个数据库,安装一直点默认就可以正常安装)
4.pymysql(进入python3.5的安装目录,进入Scripts目录下面,进入windows下的黑窗口,./pip.exe install pymysql)

一般我们只是通过python操作数据库,创建数据库和表直接在mysql的客户端进行操作

安装好mysql之后,你会在开始菜单发现一个mysql文件夹,点击mysql文件夹下面的mysql client 软件界面如下,画圈的那个:
img1.png
然后输入你在安装mysql的时候输入的密码,就进入mysql客户端,界面如下:
img2.png

然后就可以在mysql客户段输入sql语句了。

1.创建数据库
create database classTest charset=utf8;(charset=utf8是设置数据库的编码格式,classTest是数据库名称,每条语句后面跟;表示语句结束)
2.展示数据库
show databases;
3.选择数据库
use classTest;
4.创建表
create table temploee(name(varchar),salary(int),sex(tinyint));
5.删除表
drop table temploee;
6.向表里面插入数据
insert into temploee(name,salary,sex) values('xiaowang',5000,1);
7.从表里面删除数据
delete from temploee where salary=5000;(删除工资为5000的数据)
8.更新表里面的数据
update temploee set salary=4000 where sex=1;
9.查看表里面数据
select * from temploee;(查询所有数据)
select * from tempolee where salary=5000;(查询工资为五千的所有数据)
select name,sex from temploee where salary=5000;(查询工资为五千的name和sex)

常用的就是这些语句,具体详细mysql操作的可以参考我另外一篇专门写mysql数据库的文章。

接下来我们在pycharm里面用python代码来操作mysql数据库,向数据库插入一条数据,代码如下:
import pymysql
import pymysql.cursors

conn = pymysql.connect(user='root',passwd='123456',db='asia',host='127.0.0.1',port=3306)

dbcour = conn.cursor()

dbcour.execute("insert into temp(name,salary,sex) values('xiaowang',5000,1)")

conn.commit()#一定要提交不然在数据库里面看不到插入数据
conn.close()

执行上面的代码之后进入mysql客户端查看一下,会发现数据库已经增加了一条数据。

学完插入之后我们再来看一下查询数据。
import pymysql
import pymysql.cursors

conn = pymysql.connect(host='127.0.0.1',db='asia',user='root',passwd='123456')

cursor = conn.cursor()

cursor.execute("select * from temp")

print(cursor.fetchone())#fetchone()获取一条数据,fetchall()获得所有的数据,fetchmany(2)从数据库得到两条数据,rowcount属性能显示这次的查询结构能够得到多少条记录,fetchone()和fetchmany()函数都是迭代执行的,第二次执行这个函数得到的数据和第一次执行可能不一样
conn.close()

执行上面的代码就能获得数据库中的一条数据,执行结果如下:
img3.png

python爬虫(一)

安装完python开发环境肯定迫不及待想撸一发python代码。那我们就从爬虫开始吧!

我们可以先通过python 来实现这样一个简单的爬虫功能,把我们想要的网上的图片爬取到本地。下面我们就一起使用python来实现这样一个功能。

1.先获取整个页面的信息

import urllib.request

def getHtml(url):
page = urllib.request.urlopen(url).read()
page = page.decode('UTF-8')#设置编码格式,网页中有中文的话就会出现乱码
return page

html = getHtml("http://tieba.baidu.com/p/2738151262")

print (html)

urllib.request模块提供了web页面读取数据的接口,urlopen方法打开一个网址,然后再用read()读取数据,就得到了网页的源代码,注意这里的网址必须加上http://,平常我们通过浏览器输入网址,浏览器会自动帮我们加上协议头,但是自己写代码实现就得自己规定好协议头。如果要爬取的网页有中文,还要设置读取内容的编码格式。最后你就能看到爬取的页面信息了。

当然这不是我们想要的数据,接着我们就要筛选数据了。
2.筛选需要的数据

筛选数据一般用正则表达式,python提供了非常强大的正则表达式,我们后面会讲到,这里先简单用一下。

这里我找的是百度贴吧,美图吧随便挑的一个帖子当例子,来爬取上面的内容。帖子的地址是https://tieba.baidu.com/p/5207790512

我用的是谷歌浏览器,所以这里面就以谷歌浏览器为例。先打开页面,鼠标单击右键,能看到如下图的界面
审查图片

点击检查,就能看到如下的样子检查元素

通过检查元素我们找到了图片的地址,格式类似于:

修改我们的简单代码,如下

import urllib.request
import re

def getHtml(url):
page = urllib.request.urlopen(url).read()
page = page.decode('UTF-8')
return page

def getImg(page):
imglist = re.findall(r'<img class="BDE_Image" src="(.+?)" size',page)
return imglist

html = getHtml("https://tieba.baidu.com/p/5207790512")
print (getImg(html))

re模块就是python给我们提供的正则表达式包

re.findall()第一个参数是正则表达式对象,第二个参数是目标字符串,也就是我们取到的网页源代码

运行这串代码,讲打印出整个页面中包含图片的URL地址运行结果如下:img5.png

3.把找到的图片保存到本地
代码如下

import urllib.request
import re

def getHtml(url):
page = urllib.request.urlopen(url).read()
page = page.decode('UTF-8')
return page

def getImg(page):
imglist = re.findall(r'<img class="BDE_Image" src="(.+?)" size',page)
x=0
for imgurl in imglist:
f = open("%s.jpg"%x,'wb')
f.write(urllib.request.urlopen(imgurl).read())
print("正在保存图片%s.jpg"%x)
f.close()
x+=1

html = getHtml("https://tieba.baidu.com/p/5207790512")
getImg(html)

用for循环遍历刚才我们找到的图片地址,然后再一次调用urlopen就得到了图片,注意,这里的写入是wb模式,也就是二进制写入,因为是图片,和我们平常文本写入不太一样!

执行上面那串代码的结果如下:
img6.png

我们就可以欣赏我们工作成果了!!!