Movi Blog

志当存高远


  • 首页

  • 关于

  • 标签

  • 分类

  • 归档

  • 公益404

Foxit PDF Editor

发表于 2018-11-09 | 分类于 工具 |
字数统计: 347 字 | 阅读时长 ≈ 1 分钟

Foxit PDF Editor 简介

foxit pdf editor 破解版是一款真正意义上的 PDF 文档编辑软件。foxit pdf editor 破解版不像其他编辑软件只能够简单的编辑 PDF 的注释以及对一些界面有限的修改,而是对 PDF 文档的内容进行各种修改,比如:图片,文字,排版等等。foxit pdf editor 破解版不但能够修改内容,还能够编辑页面,如:导入、导出、插入、删除等等。完成对文档的编辑后,你还能够对有结果的 PDF 文档进行保存,打印,另存等操作。foxit pdf editor 破解版是你在使用 PDF 文档不错的选择。

Foxit PDF Editor 的下载及安装

将下载好的包解压,双击 FoxitPDFEditor.exe 文件进行安装,可以自定义安装,也可以一键安装

Foxit PDF Editor 的使用

选择文件,打开你要编辑的 pdf 文档

open

选择你要编辑的文字对象

delete

添加新的文本,点击导入 windows 字体,选择宋体

add

选择宋体

add2

输入你想要输入的文本,然后确定

add_txt

鼠标左键选择刚刚插入的文本,按住不放,同时移动鼠标拖拽到想要放置的位置

drag

右边的属性可以改变字体大小等

font

最后点击左上角的保存按钮就可以大功告成了

save

Navicat连接sqlServer

发表于 2018-11-07 | 分类于 数据库 |
字数统计: 193 字 | 阅读时长 ≈ 1 分钟

Navicat 的下载及安装

Navicat 下载

当然也可以下载破解版的,百搭一下,大把资源。

Navicat 的安装

一路傻瓜式的安装即可

Navicat 创建 sql server 连接

创建连接

注:主机名或 ip 地址和端口之间用’,’隔开。如:127.0.0.1,5050

Navicat 连接 sql server 遇到的问题

提示安装 sql server native client

navicat自带sqlncli_x64.msi(64位的),就在安装目录下,安装后问题解决!

安装 sqlncli_x64.msi 提示..0x80070422错误

这个安装失败是因为系统window update被禁用了,需要window + R 打开窗口运行service.msc,如下图所示:

service

找到Window Update服务,将禁用改为手动或者自动,然后确定并应用

windwo Update

重新再 navicat 上面连接 sql server 数据库即可

使用django框架搭建环境遇到的坑

发表于 2018-10-31 | 分类于 后端 |
字数统计: 581 字 | 阅读时长 ≈ 2 分钟

数据库的迁移

1、在你不适用自带的 sqlite3 数据库时,django 会要求你将 django 自带的一些表迁移到你现有的数据库中

python manage.py migrate

2、这个时候可能会问你安装了 mysql 客户端没

Did you install mysqlclient?

3、然后运行

pip install mysqlclient

又报错 Microsoft vistudo C++ 14.0 is required

4、找了一堆资料,安装了 Visual Studio 2017,然而并没有什么卵用,后来又查资料说可能是兼容性的问题,因此需要直接安装mysqlclent 编译包,然后下载资源,cp 后面的数字代表 python 版本号。

5、最好将刚刚下载的资源放到你的项目目录里面,然后(最好是在 cmd 命令窗口)

pip install mysqlclient‑1.3.13‑cp37‑cp37m‑win_amd64.whl

终于黄天不负有心人,成功安装了 mysqlclient

6、运行以下命令,迁移数据库

python manage.py migrate

成功迁移

创建 model

1、在自己创建的项目包(polls)中,编辑 models.py

from django.db import models

class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')

class Choice(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    choice_text = models.CharField(max_length=200)
    votes = models.IntegerField(default=0)

2、在 setings.py 里面加入我们创建的项目 apps.py

INSTALLED_APPS = [
    'polls.apps.PollsConfig',
    'django.contrib.admin' - 管理站点。你很快就会用到它。
    'django.contrib.auth' - 认证系统。
    'django.contrib.contenttypes' - 内容类型的框架。
    'django.contrib.sessions' - 会话框架。
    'django.contrib.messages' - 消息传递框架。
    'django.contrib.staticfiles' - 用于管理静态文件的框架。
]

3、生产迁移数据库的初始数据(polls/0001_inital.py)

py manage.py makemigrations polls

4、在命令窗口生产创建表格以及相关字段的 sql 语句

py manage.py makemigrations polls 0001

5、 运行以下命令则将生成表格以及相关字段,同时迁移到我们自己创建的数据库中

py manage.py migrate

创建超级用户

py manage.py createsuperuser

Username: admin

Email address: admin@example.com

Password: **********
Password (again): *********
Superuser created successfully

注:输入密码没反应,窗口没任何显示,一片空白,其实已经输入了,只是没有显示,输完直接回车,再输入回车就会创建 ok 了。

时区的设置

django 默认是英文,时区是 UTC

LANGUAGE_CODE = 'en-us'

TIME_ZONE = 'UTC'

语言改为中文(亲测改成 zh-cn 无效),时区改为中国

LANGUAGE_CODE = 'zh-Hans'

TIME_ZONE = 'Asia/Shanghai'

mysql安装以及配置和启动

发表于 2018-10-31 | 分类于 后端 |
字数统计: 638 字 | 阅读时长 ≈ 3 分钟

mysql 的下载及安装

mysql 的下载

mysql 下载地址

选择对应的下载文件。(我电脑是 64 位,所以这下载的是 64 位的下载文件)

mysql 的安装

msi 格式的

直接点击安装,按照它给出的安装提示进行安装

zip 格式的

zip 格式是自己解压,解压缩之后其实 MySQL 就可以使用了。

mysql 的启动

2-1、找到mysql的安装目录 **D:\tool\mysql-5.6.42-winx64\bin**

2-2、双击mysqld.exe启动mysql服务

2-3、启动cmd命令提示窗,cd到bin目录下,输入mysql -u root -p,并回车,

这个时候提示输入密码,一般初始密码为空,直接回车就进入mysql服务

用户和数据库的创建以及相关操作

数据库的创建

create database mydatabase;

创建用户

insert into mysql.user(Host,User,Password) values("localhost","test",password("1234"));

在mysql8.0版本里,用以下方式:

create user 'username'@'localhost' identified by 'pwd'

注意:此处的”localhost”,是指该用户只能在本地登录,不能在另外一台机器上远程登录。如果想远程登录的话,将”localhost”改为”%”,表示在任何一台电脑上都可以登录。也可以指定某台机器可以远程登录

为用户授权

授权格式:grant 权限 on 数据库.* to 用户名@登录主机 identified by "密码";

授权test用户拥有testDB数据库的所有权限(某个数据库的所有权限)
grant all privileges on testDB.* to test@localhost identified by '1234';

如果想指定部分权限给一用户:
grant select,update on testDB.* to test@localhost identified by '1234';

授权test用户拥有所有数据库的某些权限:  
grant select,delete,update,create,drop on *.* to test@"%" identified by "1234";

在mysql8.0版本里,用以下方式:
grant all privileges on 'testDB'.* to 'test'@'localhost'

注:如果授权不成功,则先执行 flush privileges(刷新系统权限),然后再授权,在 8.0 版本里需要更换加密方式,否则无法登陆数据库

alter user 'username'@'localhost' identified with mysql_native_password by 'newpwd'

然后刷新下权限
flush privileges

用户登录

exit; //退出当前用户

mysql -u test -p;
然后输入密码登录

注:上一步的授权里不要用test@’%’,而是用test@localhost,否则会被拒绝登录,这里有说明。

第三方工具软件的接入

创建mysql连接,输入刚刚创建的用户名和密码就可以成功连接到我们创建的数据库,

然后就可嘿嘿嘿的创建各种表了,从而进行各种操作了。

在现有Vue项目中引入React

发表于 2018-07-01 | 分类于 前端 |
字数统计: 145 字 | 阅读时长 ≈ 1 分钟

安装相应依赖以及转码打包的工具

运行以下代码

1
npm install  --save-dev react react-dom babel-cli babel-preset-react

将依赖写入package.json文件中,如下:

1
2
3
4
"react": "^16.4.1",
"react-dom": "^16.4.1",
"babel-cli": "^6.26.0",
"babel-preset-react": "^6.24.1",

修改.babelrc文件如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
{
"presets": [
["env", {
"modules": false,
"targets": {
"browsers": ["> 1%", "last 2 versions", "not ie <= 8"]
}
}],
"stage-2",
"react"
],
"plugins": ["transform-runtime"],
"comments": false,
"env": {
"test": {
"presets": ["env", "stage-2","react"],
"plugins": [ "istanbul" ]
}
}
}

最后在Vue文件中引入react相应组件

import xx.js from ./xx

js模块化

发表于 2018-02-09 | 分类于 前端 |
字数统计: 724 字 | 阅读时长 ≈ 3 分钟

Commonjs规范

  • Node.js采用了这个规范。 根据CommonJS规范,一个单独的文件就是一个模块。模块的输出必须通过module.exports导出对外的变量或接口,加载模块使用require方法,该方法读取一个文件并执行,最后返回文件内部的exports对象。

  • 在网上看了很多的Commonjs模块的定义,但是去没有说要在node的环境中,否则会报错module is not defined。只有在node环境中,每一个node.js执行文件,都自动创建一个module对象,同时,module对象会创建一个叫exports的属性,初始化的值是 {}。而exports是引用 module.exports的值。module.exports 被改变的时候,exports不会被改变,当模块导出的时候,真正导出的执行是module.exports,而不是exports。具体可以参考 NodeJS中的modu.exports和exports

AMD规范

  • 相比服务器端广泛使同步加载的CommonJS规范, AMD(异步模块定义)是为浏览器环境设计的,依赖前置。

  • requirejs即为遵循AMD规范的模块化工具。通过define方法,将代码定义为模块,然后再require进来

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    //a.js  定义模块
    define(function(require, exports, module) {
    // 导出模块内容
    return {
    a :'movi'
    }
    });

    //b.js 加载模块
    require(['a'], function (a) {
    console.log(a)
    });

CMD规范

典型的遵循CMD规范的就是sea.js,是同步加载模块,遵循就近加载原则,模块即用即返,不用前置依赖模块。

CommonJS与AMD

上面也提到了CommonJS是同步加载模块,也就是说只有加载完成才能执行后续的操作,而AMD是异步加载,允许在回调函数中处理。

由于Node.js主要用于服务器编程,模块文件一般都已经存在于本地硬盘,所以加载起来比较快,不用考虑非同步加载的方式,所以CommonJS规范比较适用。但是,如果是浏览器环境,要从服务器端加载模块,这时就必须采用非同步模式,因此浏览器端一般采用AMD规范。

兼容CommonJS规范的AMD模块输出,这时候需要在定义模块的define方法中这样写:

define(function(require,exports,module){
    var a = require("a");
    var b = require("b");
    ……
    exports.c = function(){

    }
})

ES6 Modules

ES6语法里面的模块输出export和加载模块import。之前是在vue的脚手架里面开发,用import和export的时候比较多。因为是ES6语法里面的,所以是无法直接在html页面中使用的,必须要在脚手架或者经过webpack编译打包以后才能使用。

导出模块 a.js

//导出变量
export var color = "red";
export let name = "cz";
export const age = 25;

//导出函数
export function add(num1,num2){
    return num1+num2;
}

导入模块 b.js

import { color,add } from "./a.js"

可参考CommonJS、requirejs、ES6的对比

使用electron打包桌面应用

发表于 2018-02-05 | 分类于 前端 |
字数统计: 1,409 字 | 阅读时长 ≈ 6 分钟

项目代码

github仓库代码

vue项目

确保自己有一个vue项目,可以是vue脚手架工程目录,也可以是已经生成的静态资源文件

electron安装与使用

安装electron以及相关工具

在项目根目录下面运行npm install electron –save-dev 安装electron

npm install electron-packager –save-dev 安装exe打包工具

npm install grunt –save-dev 安装grunt用于打包可安装的exe

npm install –save-dev grunt-electron-installer 安装grunt打包可安装的exe插件

在本地克隆electron官方demo项目

git clone https://github.com/electron/electron-quick-start

在Vue项目里面引入electron主程序main.js

把electron-quick-start项目中的main.js搬到vue的build文件中,并改个名字electron.js。

将electron.js里面的文件路径修改成符合本项目的路径

mainWindow.loadURL(url.format({
    pathname: path.join(__dirname, '../dist/index.html'),
    protocol: 'file:',
    slashes: true
}))

在package.json中添加入口

"scripts": {
    "dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js",
    "start": "npm run dev",
    "build": "node build/build.js",
    "electron_dev": "electron build/electron.js",  //本地调试用
    //打包成不用安装的exe文件
    "electron_build": "electron-packager ./dist/ beanSprout --win --out beanSprout --platform=win32 --arch=x64 --icon=./src/assets/favicon.ico --version 1.3.4.0  --ignore=node_modules --overwrite", 
    "ele_setup_build": "grunt" //打包成可安装的安装包
},

dev 调试环境

先运行npm run build将vue项目打包成静态资源文件,再运行electron_dev即可看到调试环境下的桌面应用

打包不用安装的exe文件(electron-packager)

运行npm run electron_build即可打包成不用安装的exe文件

“electron-packager ./dist/ beanSprout –win –out beanSprout –platform=win32 –arch=x64 –icon=./src/assets/favicon.ico –version 1.3.4.0 –ignore=node_modules –overwrite”

1、 ‘./dist’ 表示打包的源文件,即dist目录下面打包好的资源文件(需要在这个目录下面添加electron运行的入口)

dist
├── static
├── index.html
├── main.js
└── package.json

这里的main.js就是build目录下面的electron.js,不过这里的路径要修改一下

mainWindow.loadURL(url.format({
    pathname: path.join(__dirname, 'index.html'),  //这里的路径要修改
    protocol: 'file:',
    slashes: true
}))

2、’beanSprout’ 打包exe的名字

3、 ‘–win –out beanSprout’ 输出的文件夹名字

4、’–platform=win32’ 平台

5、 ‘–icon=./src/assets/favicon.ico’ 打包以后的icon,即exe图标

打包成功以后的目录如下

beanSprout
    └── beanSprout-win32-x64
                ├── ...
                └── beanSprout.exe  //双击即可运行

本例参看 j_bleach博客-electron 将pc端(vue)页面打包为桌面端应用

打包需要安装的exe文件目录(grunt-electron-installer)

首先在根目录下面新建Gruntfile.js

var grunt = require('grunt');

//进行配置
grunt.config.init({
pkg:grunt.file.readJSON('package.json'),
'create-windows-installer': {
    x64: {
        appDirectory: './beanSprout/beanSprout-win32-x64', //已经打包的electron App目录
        outputDirectory: './beanSprout/beanSproutSetup',    //输出的资源目录
        authors: 'movi',    //发布者
        exe: 'beanSprout.exe',  //这里的名字要和之前打包成不需安装exe文件的名字保持一致
        description:" A desk application based on vue and elecron",
        loadingGif:"./src/assets/install.gif",  //安装动画
        setupIcon:"./src/assets/favicon.ico" //生成桌面快捷方式的图标
    }
}
})

//加载任务
grunt.loadNpmTasks('grunt-electron-installer')

//设置默认任务
grunt.registerTask('default',['create-windows-installer'])

grunt.tasks()

运行npm run ele_setup_build即可打包成需要安装的exe文件目录

打包成功以后的目录如下

beanSprout
    └── beanSproutSetup
            ├── ...
            └── Setup.exe  //双击开始安装

可参看 Long-Island的博客-使用Grunt 插件打包Electron Windows应用

自动生成快捷方式

需要在./dist/main.js加上如下代码

var handleStartupEvent = function() {
if (process.platform !== 'win32') {
    return false;
}

var squirrelCommand = process.argv[1];
switch (squirrelCommand) {
    case '--squirrel-install':
    case '--squirrel-updated':
    install();
    return true;
    case '--squirrel-uninstall':
    uninstall();
    app.quit();
    return true;
    case '--squirrel-obsolete':
    app.quit();
    return true;
}

// 安装
function install() {
    var cp = require('child_process');
    var updateDotExe = path.resolve(path.dirname(process.execPath), '..', 'update.exe');
    var target = path.basename(process.execPath);
    var child = cp.spawn(updateDotExe, ["--createShortcut", target], { detached: true });
    child.on('close', function(code) {
        app.quit();
    });
}


// 卸载
function uninstall() {
    var cp = require('child_process');
    var updateDotExe = path.resolve(path.dirname(process.execPath), '..', 'update.exe');
    var target = path.basename(process.execPath);
    var child = cp.spawn(updateDotExe, ["--removeShortcut", target], { detached: true });
    child.on('close', function(code) {
        app.quit();
    });
}

};

if (handleStartupEvent()) {
return;
}

注意

当在dist目录下面生成electron app时,在packjson里面定义版本号

1
2
"name": "beanSprout",
"version": "1.0.1"   //亲测1.0.0和1.0.1有用

这里的版本不能随便写,不然在用grunt-electron-installer打包成安装应用时会提示版本号不对,不符合规范等,导致打包失败

新版功能用到的知识

1、引入electron shell模块运行bat脚本

const {shell} = require('electron');
shell.openItem(path); //path 本地bat文件的路径

增加*.bat脚本 可以执行相关js操作 类似于cmd窗口,在bat脚本前面加入以下代码可以隐藏cmd运行窗口

@echo off
if "%1" == "h" goto begin
mshta vbscript:createobject("wscript.shell").run("""%~nx0"" h",0)(window.close)&&exit
:begin

2、将根目录下面的package.json文件中的入口修改如下,删除build下面的electron.js

"scripts": {
    ...
    "electron_dev": "electron dist/main.js ",
    ...
},

3、新增add-new.html用于上传图片储存本地,用到的相关模块如下

node.js的fs模块的fs.open()、fs.write()、fs.writeFile()写文件和修改文件

4、页面之间的通讯

//add-new.html文件里面js
const ipc = require('electron').ipcMain;    
ipc.send('build') //build的指令。send到主进程index.js中。

//main.js主程序接收事件
const ipc = require('electron').ipcMain;
ipc.on('build',function() {
    shell.openItem(path_run_dev);
})

思考

最初的想法是想在electron外壳上加菜单栏,属于系统菜单,因此新建菜单。但是实际过程中因为路径的问题操作起来比较费劲,在你打包成exe文件的时候,只是把vue打包生成的静态资源文件夹dist打包了过去,如果你只是单纯的手动在dist里面添加页面,那么在打包的时候一定会报错。后来发现应该在vue里面写add-new模块的功能,在页面实现菜单相关功能会更容易实现些。

https-theory

发表于 2018-02-01 | 分类于 前端 |
字数统计: 20 字 | 阅读时长 ≈ 1 分钟

https原理思维导图

https 相关原理

三次握手信号的原理

HTTP 的基本原理

Hexo-next-weibo秀

发表于 2018-01-25 | 分类于 前端 |
字数统计: 312 字 | 阅读时长 ≈ 1 分钟

微博秀代码的获取

我们要登录新浪微博开放平台来获取微博秀的代码

新建微博组件

在themes/next/layout/_marco目录下面新建weibo.swig这个组件

1
2
3
4
5
6
7
8
9

{% if true %}
<div class="widget-wrap">
<h3 class="widget-title">Weibo Show</h3>
<div class="widget-weibo">
<iframe width="100%" height="550" class="share_self" frameborder="0" scrolling="no" src="//widget.weibo.com/weiboshow/index.php?language=&width=0&height=550&fansRow=2&ptype=1&speed=0&skin=5&isTitle=1&noborder=1&isWeibo=1&isFans=1&uid=5143642701&verifier=c044f752&dpc=1"></iframe>
</div>
</div>
{% endif %}

将微博秀的样式放在themes/next/source/css/_common/components/sidebar目录下面的sidebar.styl

1
2
3
4
5
6
7
8
9
10
11

.widget-title{
font-size: 14px;
font-weight: 600;
text-align:center;
}

.widget-weibo{
text-shadow: 0 1px #fff
border-radius: 3px
}

微博秀组件的引用

在themes/next/layout/_marco目录下面的sidebar.swig组件里面引入

具体的位置视情况而定,我是放在友情链接下面的

{% if theme.links %}

 ...

{% endif %}

{% include './weibo.swig' %}

踩过的坑

1、本地预览的时候要将localhost:4000替换成127.0.0.1,否则看不到

2、直接在微博里面复制的微博秀代码包含http://widget.weibo.com…,一定记得将http去掉,否则会谷歌的https认为是不安全链接,被浏览器拦截。

python爬虫

发表于 2018-01-22 | 分类于 后端 |
字数统计: 957 字 | 阅读时长 ≈ 4 分钟

项目代码

github仓库代码

Python的安装

Python的版本问题

Python3的版本还不够稳定,网上的许多第三方库还无法支持,故而选择Python2.x

Python的下载

国外的网站比较慢,直接用别人的云盘可以快速下载 国内镜像

注意勾选pip和Add python.exe to Path,然后一路傻瓜安装

Py文件运行时控制台中文乱码

在文件的最开始设置编码规则

#coding=utf-8

在需要输出的地方解码 .encode(‘utf-8’)

fout.write('<td class="summary">%s</td>'% data['summary'].encode('utf-8'))

或者引入第三方

#设置编码  
import sys 
reload(sys)  
sys.setdefaultencoding('utf-8')  
#获得系统编码格式  
type = sys.getfilesystemencoding() 

并在需要打印中文的地方解码 .decode(‘utf-8’).encode(type)

print '获取lacie连接'.decode('utf-8').encode(type)

爬虫程序的组成

爬虫的调度程序

整个爬取过程的程序主入口 spider_main.py

#引入相关模块 
import url_manager,html_downloader,html_parser,html_outputer
#实例化相关模块 
urls = url_manager.UrlManager()
downloader = html_downloader.HtmlDownLoader()
parser = html_parser.htmlParser()
outputer = html_outputer.htmlOutputer()

在引入下列相关模块(例如html下载和解析等),一定要在注意不要在函数内实例化相关模块

url管理器

1、集合python set() 函数创建一个无序不重复元素集old_urls和new_urls

2、判断是否有新的url,如果有且同时不在老地址库old_urls时,就用add(url)加入到new_urls这个数组

3、从new_urls这个新地址库获取新的地址url,同时把这个拿出来的地址放入到旧的地址库old_urls

html下载器

使用python自带的模块urllib2

引入相关模块

import urllib2

方式1

response1 = urllib2.urlopen(url)

方式2 http头

使用Request添加或修改http头
Accept:application/json
Content-Type:application/json
User-Agent:Chorme

headers={'User-Agent':'Mozilla/5.0','x-my-header':'my value'}
request = urllib2.Request(url)
request.add_header(headers)
response2 = urllib2.urlopen(request)

方式3 cookies处理
import cookielib

#声明一个CookieJar对象实例来保存cookie
cj = cookielib.CookieJar()
#利用urllib2库的HTTPCookieProcessor对象来创建cookie处理器
handler=urllib2.HTTPCookieProcessor(cj)
#通过handler来构建opener
opener = urllib2.build_opener(handler)
urllib2.install_opener(opener)
response3 = urllib2.urlopen(url)

HTML下载器的相关知识可参考 urllib2相关知识

当 response.getcode() == 200 时返回数据 response.read() 否则返回空

if response.getcode() != 200:
          return None

      return response.read() #返回数据

HTML解析器

我们使用BeautifulSoup来解析HTML,操作相关dom等。

首先引入相关模块

from bs4 import BeautifulSoup
import urlparse
import re
#html_cont是html下载器返回的结果
soup = BeautifulSoup(html_cont,'html.parser',from_encoding='utf-8') 

再结合使用soup.find_all()方法找到相关节点并获取文本等

title_node = soup.find('h1',class_='post-title') #找到对应节点
res_data['title'] = title_node.get_text()   #获取文本

中文官网地址

结果以html形式输出

#文件输出对象 w写模式
fout = open('output.html','w')  
fout.write('<html>')
fout.write('<head>')
fout.write('</head>')
fout.write('<body>')
fout.write('<div><p>%s</p></div'% data['url'])
fout.write('<div class="title">%s</div>'% data['title'].encode('utf-8'))
fout.write('<div class="summary">%s</div>'% data['summary'].encode('utf-8'))
fout.write('</body>')
fout.write('</html>')

#关闭输出
fout.close()

踩过的坑

1、在爬虫调度程序里引入相关模块(例如html下载和解析等),一定要在注意不要在函数内实例化相关模块

2、在循环或者迭代中不可以操作当前的循环对象,即不能删除操作,否则会报错

list_urls = list(self.new_urls) 
for i in list_urls:
    if url.find(i) != -1 or i.find(url) != -1:
        self.new_urls.remove(i)

可复制出一个新的列表,在列表里面循环,然后操作原集合删除操作

3、检查字符串中是否包含另一个字符串的方法有两个index()和find(), 两者的区别在于index()查找不到字符串时会报错,而find()会返回-1

str1 = "this is string example....wow!!!";
str2 = "movi";

print str1.index(str2); // ValueError: substring not found
print str1.find(str2);  // -1
123
MoviLee

MoviLee

心无所恃 随遇而安

25 日志
8 分类
60 标签
GitHub 微博 知乎 E-Mail
Links
  • Evans (另一个屌丝前端)
  • Cmk (技术架构工程师)
© 2022 MoviLee
由 Hexo 强力驱动
|
主题 — NexT.Gemini v5.1.4