php laravel 开源项目整理

转载自:

原型项目

CMS

  • Bootstrap CMS —— Laravel 5.1驱动的功能强大的CMS
  • October —— 基于Laravel 5,致力于让开发工作变得简单的CMS
  • PyroCMS —— MVC架构的PHP内容管理系统,3.0以前基于CodeIgniter,目前基于Laravel 5.1
  • LavaLite —— 基于Laravel 5.1 & Bootstrap 3的内容管理系统
  • TypiCMS —— 基于 Laravel 5 构建的、支持多语言的内容管理系统
  • Laravel and AngularJS CMS —— 基于Laravel 5.1和AngularJS的CMS
  • Microweber —— 基于 Laravel 拖拽式生成 CMS 及在线商店利器
  • AsgardCMS —— 基于 Laravel 构建的、支持模块化和多语言的CMS
  • CoasterCMS —— 基于Laravel 5.3构建的下一代CMS
  • laravelPCMS

CRM

  • Flarepoint —— 基于Laravel构建的免费开源CRM平台

论坛

  • Laravel.io —— Laravel开发者社区
  • Flarum —— 免费的、开源的、专注于简约的论坛系统,esoTalk和FluexBB的联合继承者
  • PHPHub —— 基于Laravel 4.2,积极向上的 PHP & Laravel 开发者社区

社交网站

  • ThinkSNS+ —— 基于 Laravel + Vue.js 开发的全新社交系统
  • Voten —— 基于 Laravel + Vue.js 实现的实时社交书签系统(Reddit)

电商

  • Antvel —— 基于 Laravel 5.* 开发的开源电子商务项目

项目管理

  • 92five app —— 基于 Laravel框架 & Backbone JS 构建,是一个自托管的、基于web的项目管理应用
  • Scrumwala —— 基于Laravel5,项目管理应用
  • Ribbbon —— 基于Laravel 5.1和Vue.js构建的开源项目管理系统

博客

  • Canvas —— 基于Laravel 5.2 开发的轻量级博客系统
  • Katana —— 静态博客/站点生成器(支持Markdown和GitHub Pages)
  • Laravel 5 Blog —— 基于 Laravel 5 开发的博客系统
  • Vuedo —— 基于 Laravel 和 Vue.js 构建的博客平台
  • Wardrobe —— 专注于写作的最小化博客平台
  • MyPersimmon —— 基于 Laravel 5.4 开发的博客系统

后台模板

其他

  • Laravel.com —— Laravel官网源码
  • Laravel Tricks —— Laravel小技巧&小贴士
  • Invoice Ninja —— 基于Laravel构建的开源发票及时间跟踪应用
  • Paperwork —— 基于Laravel 4.X的开源的笔记&归档工具
  • Cachet —— 基于Laravel 5的开源的状态页系统
  • StyleCI —— 由 PHP CS Fixer开发,提供PHP代码风格持续集成服务
  • Podcastwala —— 基于Laravel 5,构建属于你自己的播客网站
  • Deployer —— 基于Laravel 5.1的、免费的、开源的PHP应用部署工具
  • RSS Monster —— 基于 Lumen 开发的 RSS 聚合器和阅读器
  • Koel —— 基于 Laravel 5.1 & Vue.js 开发的酷炫音乐流媒体应用
  • Attendize —— 基于 Laravel 框架开发的开源门票及活动管理应用
  • Notadd —— 基于 Laravel 的下一代 PHP 开发框架(API+SPA 单页应用 )
  • Blockscloud —— 基于 Laravel + Vue 实现的 Web OS 系统
  • Laravel Elixir简介及入门教程

安装教程

插件

微信小程序 for Laravel 5

排名 下载次数 Star 数 扩展包 一句话描述
1 2883968 3968 intervention/image 图片处理扩展包,支持裁剪、水印等处理,使用教程请见 https://laravel-china.org/topics/1903
2 2215372 3694 barryvdh/laravel-debugbar 页面调试工具栏 (对 phpdebugbar 的封装),教程请见:https://laravel-china.org/topics/2531
3 2173424 3570 barryvdh/laravel-ide-helper 使用 IDE 开发 Laravel 项目的好帮手,支持 Facade 方法跳转,相关讨论请见:https://laravel-china.org/topics/2532
4 1269005 2396 maatwebsite/excel Excel 处理工具,中文处理时会出现乱码,推荐使用 laravel-snappy,历史讨论请见 https://laravel-china.org/topics/2477
5 1131952 702 aws/aws-sdk-php-laravel 亚马逊 AWS 服务的开发者工具包,亚马逊云已经在 2016 年 8 月 正式落地中国,这个包以后会常用到,教程请见:https://laravel-china.org/topics/2533
6 750405 1016 jenssegers/agent 客户端 User Agent 解析工具(基于 Mobiledetect),教程请见:https://laravel-china.org/topics/782
7 711842 216 bugsnag/bugsnag-laravel Bugsnag 服务集成包(异常捕获服务,可惜国内访问效果不好),教程请见:https://laravel-china.org/topics/2534
8 683268 3268 zizaco/entrust 基于用户组的用户权限系统(必备),教程请见:https://laravel-china.org/topics/166
9 644651 821 barryvdh/laravel-cors 跨域资源共享的支持
10 571221 963 barryvdh/laravel-dompdf PDF 操作工具(基于 dompdf )
11 548367 1172 laravelbook/ardent 自动 数据模型 验证工具
12 534650 2364 tymon/jwt-auth JWT (JSON Web Token) 用户认证机制,示例项目 https://laravel-china.org/topics/2023
13 496656 1977 lucadegasperi/oauth2-server-laravel OAuth 2.0 支持,实例教程:https://laravel-china.org/topics/1792
14 468263 595 maknz/slack Slack 服务的集成
15 423728 1920 jenssegers/mongodb MongoDB 数据库的支持 ,教程:https://laravel-china.org/topics/309
16 390006 4061 dingo/api 构建 API 服务器的完整解决方案,教程:https://laravel-china.org/topics/1159
17 370341 912 itsgoingd/clockwork 配合 Chrome 浏览器下同名插件的调试工具,教程:https://laravel-china.org/topics/23
18 357552 600 anahkiasen/underscore-php Underscore.js 类似的 PHP 语法支持
19 355742 1191 laracasts/generators Laracasts 出品的代码快速生成工具(推荐) ,使用教程:https://laravel-china.org/topics/2535
20 344522 1200 cviebrock/eloquent-sluggable 文章标题 URL 别名处理工具,教程:https://laravel-china.org/topics/1926
21 344237 382 laracasts/testdummy Laracasts 出品的假数据创建工具
22 321543 709 davejamesmiller/laravel-breadcrumbs 页面面包屑工具,教程:https://laravel-china.org/topics/1914
23 309529 962 laracasts/utilities 将 PHP 变量转换为 JavaScript 变量
24 304501 621 roumen/sitemap Sitemap 生成工具
25 303660 827 yajra/laravel-datatables-oracle jQuery DataTables 的后端支持
26 302076 336 webpatser/laravel-uuid RFC 4122 标准生成的 UUID ,使用教程 https://laravel-china.org/topics/2538
27 301605 535 rcrowe/twigbridge Twig 模板引擎支持
28 294356 218 intervention/imagecache 图片缓存增强工具
29 289380 958 indatus/dispatcher 计划任务分发器(直接可替换掉 Cron),L5 内置了类似的功能
30 234578 589 jenssegers/date 日期处理工具(让 Carbon 支持多语言,中文用户的福音)
31 234151 715 rap2hpoutre/laravel-log-viewer 非常方便的页面 Log 查看工具,必备,不过使用时请注意访问权限控制
32 204976 1109 baum/baum 嵌套集合 (Nested Set) 模型的支持,教程:https://laravel-china.org/topics/2124
33 204619 2146 anahkiasen/rocketeer 现代化的服务器代码部署工具
34 194675 1026 anahkiasen/former 强大的表单构造器,教程请见 https://laravel-china.org/topics/2539
35 190032 375 barryvdh/laravel-snappy HTML 生成 PDF/Image 工具(利用 wkhtmltopdf)
36 184879 361 thujohn/twitter Twitter API 的支持
37 184078 228 orchestra/testbench Laravel 扩展包的单元测试工具
38 181799 258 graham-campbell/flysystem 文件系统操作,多平台支持(AWS,Dropbox 等)
39 180921 342 mews/purifier 用户提交的 Html 白名单过滤,https://laravel-china.org/topics/36
40 175355 349 laracasts/presenter Laracasts 出品的 Presenter 方案
41 172640 852 venturecraft/revisionable 数据模型的操作记录(如管理员操作日记)
42 168707 995 mcamara/laravel-localization Laravel 本地化功能增强
43 166917 366 league/factory-muffin 允许更加方便的创建对象,一般在测试中常用(基本上是 ROR 的 factory_girl 的复制版)
44 165140 271 robclancy/presenter Elequent 的 Presenter 方案
45 163835 150 intouch/laravel-newrelic 应用状态监控服务 NewRelic 开发者工具包
46 157930 855 xethron/migrations-generator 从现存的数据中以 migration 的形式导出数据库表,包括索引和外键,相当于 数据库迁移
47 149079 410 greggilbert/recaptcha reCAPTCHA 验证码的支持
48 144971 594 watson/validating 以 Trait 的方式来实现 Eloquent 数据模型保存的时候自动验证
49 142284 814 dimsav/laravel-translatable 数据库的多语言翻译方案
50 138661 120 laracasts/behat-laravel-extension Behat 测试框架的 Laravel 支持
51 137782 200 jenssegers/rollbar Rollbar 错误监控服务的自动集成
52 134723 330 torann/geoip 通过 IP 获取到对应的地理位置信息(GeoIP 数据库),请参考:https://laravel-china.org/topics/2537
53 133803 658 davibennun/laravel-push-notification App 的 Push Notification 发送工具,支持苹果的 APNS 和 安卓的 GCM
54 128523 168 chumper/zipper ZIp 打包工具(基于 ZipArchive)
55 127700 244 simplesoftwareio/simple-qrcode 二维码生成工具
56 125421 374 graham-campbell/markdown Markdown 解析器
57 125315 164 aloha/twilio Twillio API 支持
58 123623 295 propaganistas/laravel-phone 手机号码,电话号码验证支持
59 121845 421 orangehill/iseed 将数据从数据库以 seed 的方式导出,数据填充 的逆向操作。(推荐)
60 121350 380 sammyk/laravel-facebook-sdk (非官方)Laravel 的 Facebook 开发者工具包
61 120891 497 vinkla/hashids Hash ID 生成器,方便把数字的 ID 隐藏(基于Hashids),教程:https://laravel-china.org/topics/2536
62 116939 993 spatie/laravel-backup 数据备份工具,支持压缩,支持各种文件系统(推荐)
63 116718 459 mccool/laravel-auto-presenter 自动注入 Presenter,教程:https://laravel-china.org/topics/1267
64 111879 270 graham-campbell/throttle 阀门控制工具
65 106306 1766 frozennode/administrator 快速创建基于数据模型的 CRUD 管理员后台,教程:https://laravel-china.org/topics/158 , https://laravel-china.org/topics/2407
66 105181 430 codesleeve/laravel-stapler 专为 ORM 定制的文件上传支持
67 100442 307 webpatser/laravel-countries 世界所有国家数据,包括首都汇率等
68 97451 848 prettus/l5-repository Repository 开发模式的支持
69 96491 371 pragmarx/google2fa 用户认证方案,支持谷歌提倡的双向认证和 HOTP 认证算法
70 94117 195 hisorange/browser-detect 浏览器检测工具,包括客户端对 JavaScript 和 CSS 支持情况的检测,教程:https://laravel-china.org/topics/2046
71 93442 277 graham-campbell/htmlmin 基于 minify 的 HTML 压缩工具
72 90609 156 toin0u/geocoder-laravel 地理位置操作工具集(基于Geocoder)
73 89845 491 edvinaskrucas/notification 页面消息提醒的组件
74 89333 403 laracasts/integrated PHPUnit 的集成测试支持
75 88682 779 laravel/envoy Laravel 官方出品的简单的部署工具,教程:https://laravel-china.org/topics/24
76 86793 137 felixkiss/uniquewith-validator 表单验证规则增加字段之间的唯一性验证
77 81211 200 graham-campbell/exceptions 错误异常处理工具,支持开发和生产环境,使用 Whoops 进行错误显示
78 81076 163 thomaswelton/laravel-gravatar Gravatar 服务的支持
79 79494 477 mews/captcha 图片验证码方案,使用教程请见:https://laravel-china.org/topics/2895
80 79387 222 roumen/feed Feed 生成器
81 79241 164 cviebrock/image-validator 表单验证增加图片专属,如长宽,比例等
82 77849 125 laravelcollective/annotations 基于注解方式生成路由、事件、模型绑定的映射
83 77061 870 gloudemans/shoppingcart 一个简单的购物车模块实现
84 75852 149 artisaninweb/laravel-soap Soap 协议客户端
85 75476 260 jlapp/swaggervel Swagger API 规范支持
86 73124 480 barryvdh/laravel-translation-manager 翻译辅助工具,包含 Web 界面
87 72532 515 patricktalmadge/bootstrapper Twitter Bootstrap 支持
88 68952 133 soapbox/laravel-formatter 对不同输出格式进行转换,支持Array,CSV,JSON,XML,YAML
89 66968 155 fedeisas/laravel-mail-css-inliner 将 CSS 样式写入 HTML 里,用于邮件发送内容的样式定制
90 66881 747 nicolaslopezj/searchable 以 Trait 的形式为 Eloquent 模型增加搜索功能
91 65754 109 benconstable/phpspec-laravel PHPSpec BDD 测试框架的 Laravel 扩展
92 65489 193 watson/rememberable 让 Laravel 5 数据模型支持 remember() 方法
93 63895 373 rtconner/laravel-tagging 为 Eloquent 模型增加打标签功能
94 62932 68 laravelcollective/remote LaravelCollective 维护的 SSH 连接管理工具
95 60917 226 khill/lavacharts Google 图表 JavaScript API 的封装
96 60203 115 anchu/ftp 让 Laravel 支持 FTP 操作
97 58556 355 liebig/cron 计划任务分发器(直接可替换掉 Cron),L5 内置了类似的功能
98 57174 348 lord/laroute JavaScript 读取路由信息的解决方案
99 57053 643 spatie/laravel-analytics Google 统计数据获取工具
100 56639 118 hieu-le/active 非常方便的方案来判断导航元素的 active 状态,使用教程请见:https://laravel-china.org/topics/2858

中国电信 cn2 是什么

中国电信

中国电信是世界上最大的固网运营商和宽带服务提供商,为一亿宽带用户和超过230万中国网站提供了中国互联网信息的接入服务。在中国拥有超过300骨干网节点和4000Gbps的网络带宽,70%的中文资源和和超过90万宽带用户。

中国电信在全球部署超过40个POP节点(关键的交换中心),节点如图:

资料来源:中国电信集团公司

CN2

CN2全称为中国电信下一代承载网,英文Chinatelecom Next Carrier Network,缩写为CNCN,进一步缩写为CN2。

CN2采用全网MPLS、保证8个等级的QoS以及支持全网组播和IPv6硬件转发等代表当今IP尖端技术的网络。由600多台T级交换容量的高端路由器、194个节点组成,耗资13亿. 中国电信对它“职业生涯”的规划是“承载3G的话音和数据传输、NGN业务承载、VIP集团用户的联网以及流媒体业务”,老的ChinaNet———即163、169网络将主要被用作ADSL、拨号等INTERNET接入和浏览业务。

CN2网络特征——骨干网简洁化


Python Selenium 中 Chrome 的一些设置参数

cookie

mport pickle
import selenium.webdriver 

driver = selenium.webdriver.Chrome()
driver.get("http://www.google.com")
pickle.dump( driver.get_cookies() , open("cookies.pkl","wb"))
import pickle
import selenium.webdriver 

driver = selenium.webdriver.Chrome()
driver.get("http://www.google.com")
cookies = pickle.load(open("cookies.pkl", "rb"))
for cookie in cookies:
    driver.add_cookie(cookie)

注意使用时要先访问目标的网址,再加载 cookie,否则可能会出现下面两个错误:

  • failed to set the ‘cookie’ property on ‘document’ access is denied for this document
  • Cookies are disabled inside ‘data:’ URLs

以下转载自selenium 怎样设置请求头?

目录

  • 一:selenium设置phantomjs请求头:
  • 二:selenium设置chrome请求头:
  • 三:selenium设置chrome–cookie:
  • 四:selenium设置phantomjs-图片不加载:

一:selenium设置phantomjs请求头:

# !/usr/bin/python
# -*- coding: utf-8 -*-

from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities

dcap = dict(DesiredCapabilities.PHANTOMJS)
dcap["phantomjs.page.settings.userAgent"] = (
"Mozilla/5.0 (Linux; Android 5.1.1; Nexus 6 Build/LYZ28E) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.23 Mobile Safari/537.36"
)
driver = webdriver.PhantomJS(desired_capabilities=dcap)
driver.get("https://httpbin.org/get?show_env=1")
driver.get_screenshot_as_file('01.png')
driver.quit()

二:selenium设置chrome请求头:

来源selenium设置Chrome - TTyb - 博客园 感恩原作者

如代码

# !/usr/bin/python
# -*- coding: utf-8 -*-

from selenium import webdriver
# 进入浏览器设置
options = webdriver.ChromeOptions()
# 设置中文
options.add_argument('lang=zh_CN.UTF-8')
# 更换头部
options.add_argument('user-agent="Mozilla/5.0 (iPod; U; CPU iPhone OS 2_1 like Mac OS X; ja-jp) AppleWebKit/525.18.1 (KHTML, like Gecko) Version/3.1.1 Mobile/5F137 Safari/525.20"')
browser = webdriver.Chrome(chrome_options=options)
url = "https://httpbin.org/get?show_env=1"
browser.get(url)
browser.quit()

三:selenium设置chrome–cookie:

cookie用于模拟登陆

# !/usr/bin/python
# -*- coding: utf-8 -*-

from selenium import webdriver
browser = webdriver.Chrome()

url = "https://www.baidu.com/"
browser.get(url)
# 通过js新打开一个窗口
newwindow='window.open("https://www.baidu.com");'
# 删除原来的cookie
browser.delete_all_cookies()
# 携带cookie打开
browser.add_cookie({'name':'ABC','value':'DEF'})
# 通过js新打开一个窗口
browser.execute_script(newwindow)
input("查看效果")
browser.quit()

四:selenium设置phantomjs-图片不加载:

from selenium import webdriver

options = webdriver.ChromeOptions()
prefs = {
    'profile.default_content_setting_values': {
        'images': 2
    }
}
options.add_experimental_option('prefs', prefs)
browser = webdriver.Chrome(chrome_options=options)

# browser = webdriver.Chrome()
url = "http://image.baidu.com/"
browser.get(url)
input("是否有图")
browser.quit()

参考资料


python 字典的一些操作

字典是一个非常常用的数据类型,这一篇记录一些常用用法。

遍历

dict={"a":"apple","b":"banana","o":"orange"} 

for i in dict: 
  print "dict[%s]=" % i,dict[i] 

for (k,v) in  dict.items(): 
  print "dict[%s]=" % k,v 

for k,v in dict.iteritems(): 
  print "dict[%s]=" % k,v 

for k,v in zip(dict.iterkeys(),dict.itervalues()): 
  print "dict[%s]=" % k,v

key 是否存在

dict.has_key()
key in dict.keys()

for 循环按顺序输出

字典的本质是hash表,一种散列表结构,数据输入后按特征已经被散列了,注定它就是无序的。

所以预先添加的内容输出的顺序是不可预期的。有两种解决方法

  1. 不使用dict,使用元组,元组是记录输入顺序的、有序的,也能方便地转换成dict。
  2. 另用一个列表记录下输入时的顺序。

参考资料


Python Selenium 的 XPath 定位方式详解

先介绍一下 XPath。XPath 是一门在 XML 文档中查找信息的语言。可用来在 XML 文档中对元素和属性进行遍历。

在 selenium 中定位元素,使用 XPath 能更好的抽象代码(比如讲 XPath 表达式提取成一个单独的配置)。所以我在日常使用中尽量使用 XPath。

HTML与XML

html 是标记语言,XML 是标记语言的元语言。

HTML和XML的最大区别在于:HTML是一个定型的标记语言,它用固有的标记来描述,显示网页内容。比如<H1>表示首行标题,有固定的尺寸。相对的,XML则没有固定的标记,XML不能描述网页具体的外观,内容,它只是描述内容的数据形式和结构。

Xpath定位方法

本小节节选自 Xpath定位方法深入探讨及元素定位失败常见情况

绝对定位

driver.findElement(By.xpath("/html/body/div/form/input"))。

特点:这个路径是从网页起始标签开始一直到要定位的元素的路径,如果要定位的元素在页面最下面,则这个Xpath路径会非常长。如果在要定位的元素与页面开始之间的元素有任何增减,元素定位就会失败。

相对定位

driver. findElement(By.xpath ("//input") )

返回查找到的第一个符合条件的元素。

特点:相对路径一般只会包含与被定位元素最近的几层元素有关,相对路径写的好的话,页面变动影响最小,而且定位准确。

索引定位

使用索引定位元素,索引的初始值为1。

driver. findElement(By.xpath ("//input[2]") )

返回查找到的第二个符合条件的元素。

属性值定位

driver. findElement(By.xpath ("//input[@id='username']"));
driver. findElement(By.xpath ("//img[@alt='flowr']"));

特点:属性定位也是比较常用的方法,如果元素中没有常见的id,name,class等直接有方法可调用的属性,也可以查找元素中是否有其他能唯一标识元素的属性,如果有,就可以用此方法定位。

逻辑运算符 and与or

driver.findElement(By.xpath("//input[@id='username' and @name='userID']"));

特点:多个属性值联合定位,更能准确定位到元素。并且如果多个相同标签的元素,如果其包含的属性值有不同的,也可以用这个方法区分开来。

属性名定位

driver. findElement(By.xpath ("//input[@button]"))

特点:此方法可以区分同一种标签,含有不同属性名的元素。定位相对简单一些儿,但也同样存在着无法区分同种标签含有同种属性名的多个元素,这个时候要配合索引定位才行。

属性值匹配

(a)starts-with()

driver. findElement(By.xpath ("//input[stars-with(@id,'user')]"))

(b)ends-with()

driver. findElement(By.xpath ("//input[ends-with(@id,'name')]"))

(c)contains()

driver. findElement(By.xpath ("//input[contains(@id,"ernam")]"))

特点:此方法更加灵活,可以定位属性值不太规律,或是部分变动,中间有空格的情况。注:如果属性值中间包含空格,Webdriver定位的时候容易出错,时而能定位到时而定位不到,所以应该避免用含用空格的属性值定位。可以采用此方法,进行部分属性值定位。

任意属性值匹配

driver. findElement(By.xpath ("//input[@*='username']"))

特点:此方法相当于模糊查询,只要欲定位的标签,如input中任何属性值等于‘username’,就能匹配成功。缺点,可能会匹配含有这个属性值的其他元素,所以我们在定位的时候要查看一下这个元素值在页面中是否唯一。

XPath 轴匹配

选自 Python selenium —— 父子、兄弟、相邻节点定位方式详解

普通方式
# -*- coding: utf-8 -*-
from selenium import webdriver

driver = webdriver.Chrome()
driver.get('http://www.baidu.com')

# 1.xpath 父子关系
print driver.find_element_by_xpath("//div[@id='B']/div").text

# 1.xpath 父子关系
# `.`代表当前节点; '..'代表父节点
print driver.find_element_by_xpath("//div[@id='C']/../..").text

# 1.xpath,通过父节点获取其哥哥节点
print driver.find_element_by_xpath("//div[@id='D']/../div[1]").text

# 1.xpath,通过父节点获取其弟弟节点
print driver.find_element_by_xpath("//div[@id='D']/../div[3]").text
XPath 轴
# 1.xpath轴 child 父子关系
print driver.find_element_by_xpath("//div[@id='B']/child::div").text # child是xpath默认的轴,可以忽略不写

# 1.xpath轴 parent 父子关系
print driver.find_element_by_xpath("//div[@id='C']/parent::*/parent::div").text

# 1.xpath轴 preceding-sibling 哥哥节点
print driver.find_element_by_xpath("//div[@id='D']/preceding-sibling::div[1]").text

# 1.xpath轴 following-sibling 弟弟节点
print driver.find_element_by_xpath("//div[@id='D']/following-sibling::div[1]").text

# 1.xpath轴 following 弟弟节点
print driver.find_element_by_xpath("//div[@id='D']/following::*").text

xpath常用函数

  1. child 选取当前节点的所有子节点
  2. parent 选取当前节点的父节点
  3. descendant 选取当前节点的所有后代节点
  4. ancestor 选取当前节点的所有先辈节点
  5. descendant-or-self 选取当前节点的所有后代节点及当前节点本身
  6. ancestor-or-self 选取当前节点所有先辈节点及当前节点本身
  7. preceding-sibling 选取当前节点之前的所有同级节点
  8. following-sibling 选取当前节点之后的所有同级节点
  9. preceding 选取当前节点的开始标签之前的所有节点
  10. following 选去当前节点的开始标签之后的所有节点
  11. self 选取当前节点
  12. attribute 选取当前节点的所有属性
  13. namespace 选取当前节点的所有命名空间节点

路径表达式

表达式 描述
nodename 选取此节点的所有子节点。
/ 从根节点选取。
// 匹配任意多的节点,而不考虑它们的位置。
. 选取当前节点。
.. 选取当前节点的父节点。
@ 选取属性。

谓语(Predicates)

谓语用来查找某个特定的节点或者包含某个指定的值的节点。

路径表达式 结果
/bookstore/book[1] 选取属于 bookstore 子元素的第一个 book 元素。
/bookstore/book[last()] 选取属于 bookstore 子元素的最后一个 book 元素。
/bookstore/book[last()-1] 选取属于 bookstore 子元素的倒数第二个 book 元素。
/bookstore/book[position()<3] 选取最前面的两个属于 bookstore 元素的子元素的 book 元素。
//title[@lang] 选取所有拥有名为 lang 的属性的 title 元素。
//title[@lang=’eng’] 选取所有 title 元素,且这些元素拥有值为 eng 的 lang 属性。
/bookstore/book[price>35.00] 选取 bookstore 元素的所有 book 元素,且其中的 price 元素的值须大于 35.00。
/bookstore/book[price>35.00]/title 选取 bookstore 元素中的 book 元素的所有 title 元素,且其中的 price 元素的值须大于 35.00。

通配符

XPath 通配符可用来选取未知的 XML 元素。

通配符 描述  
* 匹配任何元素节点。  
@* 匹配任何属性节点。  
node() 匹配任何类型的节点。

例子:

路径表达式 结果
/bookstore/* 选取 bookstore 元素的所有子元素。
//* 选取文档中的所有元素。
//title[@*] 选取所有带有属性的 title 元素。

多个表达式

通过在路径表达式中使用“|”运算符,您可以选取若干个路径 例子:

路径表达式 结果  
//book/title //book/price 选取 book 元素的所有 title 和 price 元素。
//title //price 选取文档中的所有 title 和 price 元素。
/bookstore/book/title //price 选取属于 bookstore 元素的 book 元素的所有 title 元素,以及文档中所有的 price 元素。

关键字

关键字 结果
starts-with 顾名思义,匹配一个属性开始位置的关键字
contains 匹配一个属性值中包含的字符串
text() 匹配的是显示文本信息,此处也可以用来做定位用
Sibling 提取指定元素的所有同级元素,即获取目标元素的所有兄弟节点。

例子:

例子 结果
//input[starts-with(@name,’name1’)] 查找name属性中开始位置包含’name1’关键字的页面元素
//input[contains(@name,’na’)] 查找name属性中包含na关键字的页面元素
//a[text()=’百度搜索’]  
//a[contains(text(),”百度搜索”)]  
//a[not(contains(@id, ‘xx’))]  
//div[(contains(@class,’typeA’) or contains(@class,’typeB’)) and not(contains(@class,’ng-hide’))]  

参考资料


Python 的 object 类

结论

先说结论,Python中的一切都是对象,它们要么是类的实例,要么是元类的实例 .

在图中可以看出对象分两种:

  1. classes(类)
  2. instances(实例)

虚线表示一个对象的type(类型),实线表示一个对象的base(基类/父类).

首先我们要明确,类创造了实例,而不是继承关系。那么问题来了,是什么创造了类呢? Python 引进了metaclasses,<type 'type'>就是元类,它可以创建类.

使用

可以参考一下这些链接:

由于历史原因,2.x 里 object 是新基类,需要显示定义。在3.x里,object已经默认做为所有东西的基类了。

class A:  # 旧式类
    pass

class B(object):  # 新式类
    pass

两个方法:

  • issubclass(A,B) (测试超类-子类关系) :A 是 B 的子类,B 是 A 的超类
  • isinstance(A,B) (测试类型-实例关系) ,A 是 B 的实例

    class Foo(object):
        pass
    	
    class Bar(Foo):
        pass
    	
    print issubclass(Foo,object)
    print issubclass(Bar,object)
    print isinstance(Bar(),Foo)
    

原因

那么问题来了,为什么要加入新式类呢?

新式类有很多优势:

  • 基于内建类型构建新的用户类型
  • 支持property和描述符特性等.
  • 定义了一些特殊方法,子类可以对这些方法进行覆盖以满足自身的特殊需求.

      `__new__()`
      `__init__()`
      `__delattr__()`
      `__getattribute__()`
      `__setattr__()`
      `__hash__()`
      `__repr__()`
      `__str__()`
    

另外新式类和旧式类还有一个区别就是在多继承的时候,查找要调用的方法。新式类是广度优先的查找算法。旧式类的查找方法是深度优先的.

参考资料


Python 中的 if __name__ == '__main__'

if name == ‘main’ 是一个Python 初学者摸不着头脑的东西。例如下面一个简单的文件:

PI = 3.14

def main():
    print "PI:", PI

if __name__ == "__main__":
    main()

引用知乎上的这个非常简约的答案:

name 是当前模块名,当模块被直接运行时模块名为 main 。这句话的意思就是,当模块被直接运行时,以下代码块将被运行,当模块是被导入时,代码块不被运行。』

下面循序渐进做一些解释。

首先先普及Python 的一个基础概念——模块。

Python 模块(Module),是一个 Python 文件,以 .py 结尾,包含了 Python 对象定义和Python语句。
模块让你能够有逻辑地组织你的 Python 代码段。
把相关的代码分配到一个模块里能让你的代码更好用,更易懂。
模块能定义函数,类和变量,模块里也能包含可执行的代码。

所有的模块都有一个内置属性 name。一个模块的 name 的值取决于您如何应用模块。

如果 import 一个模块,那么模块__name__ 的值通常为模块文件名,不带路径或者文件扩展名。但是您也可以像一个标准的程序样直接运行模块,在这 种情况下, name 的值将是一个特别缺省”main“。

解释型语言和编译型语言

首先我们平时所使用的程序语言都是高级程序语言,分为解释型语言和编译型语言。

对于编译型语言——C,C++,以及完全面向对象的编程语言 Java,C# 等,他们都是先将程序编译成二进制再运行,都需要有一个 main 函数来作为程序的入口。

而解释型语言(比如 Python)则不同,它是动态的逐行解释运行。也就是从脚本第一行开始运行,没有统一的入口。

一个 Python 源码文件除了可以被直接运行外,还可以作为模块(也就是库)被导入。不管是导入还是直接运行,最顶层的代码都会被运行(Python 用缩进来区分代码层次)。

name

__name__ 是内置变量,用于表示当前模块的名字,同时还能反映一个包的结构。

如果一个模块被直接运行,则其没有包结构,其 __name__ 值为 __main__。比如我们新建一个文件 test.py

# -*- coding:utf-8 -*-
print __name__

运行 python test.py 输出结果为

__main__

如果是以导入的方式运行的,比如我们再新建一个文件 testMain.py,仅仅导入不做任何事:

# -*- coding:utf-8 -*-
import test

运行 python testMain.py 输出结果为

test

我们也可以直接以模块的方式运行 test.py文件——python -m test.py,结果如下:

test
xxxx : No module named test.py

到这里,我们基本上就完全知道了 __name__ 是什么了。

参考资料