
目前来说,我的解决办法很简单就是 ,不用 socks 代理 2333333333
因为需要 自动化下载一些国外资料,所以本地用了 shadowsocks 来代理终端的连接:
export ALL_PROXY=socks5://127.0.0.1:1086
然而 Python 当前的包没有支持 socks 代理的。于是我选择了最简单的办法,用 http 代理,而不是 socks 代理:
export ALL_PROXY=https://127.0.0.1:1087

目前来说,我的解决办法很简单就是 ,不用 socks 代理 2333333333
因为需要 自动化下载一些国外资料,所以本地用了 shadowsocks 来代理终端的连接:
export ALL_PROXY=socks5://127.0.0.1:1086
然而 Python 当前的包没有支持 socks 代理的。于是我选择了最简单的办法,用 http 代理,而不是 socks 代理:
export ALL_PROXY=https://127.0.0.1:1087

转载自:
| 排名 | 下载次数 | 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 |

中国电信是世界上最大的固网运营商和宽带服务提供商,为一亿宽带用户和超过230万中国网站提供了中国互联网信息的接入服务。在中国拥有超过300骨干网节点和4000Gbps的网络带宽,70%的中文资源和和超过90万宽带用户。
中国电信在全球部署超过40个POP节点(关键的交换中心),节点如图:

资料来源:中国电信集团公司
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网络特征——骨干网简洁化

user_data_dir = "/Users/kelu/Library/Application Support/Google/Chrome"
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument(f"--user-data-dir={user_data_dir}") # 加载用户数据
chrome_options.add_argument("--profile-directory=Profile 1") # 替换为实际使用的配置文件夹名
chrome_options.add_argument("--disable-features=SameSiteByDefaultCookies,CookiesWithoutSameSiteMustBeSecure")
chrome_options.add_argument("--disable-blink-features=AutomationControlled")
chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"])
chrome_options.add_experimental_option("useAutomationExtension", False)
chrome_options.add_argument("--no-sandbox")
chrome_options.add_argument("--disable-dev-shm-usage")
# 设置浏览器语言为日语
chrome_options.add_argument("--lang=ja") # 强制 UI 语言为日语
chrome_options.add_experimental_option(
"prefs", {"intl.accept_languages": "ja,ja-JP"} # 设置 Accept-Language 请求头
)
# 启动浏览器
driver = webdriver.Chrome(options=chrome_options)
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,否则可能会出现下面两个错误:
以下转载自selenium 怎样设置请求头?
# !/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 - 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()
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()
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()

字典是一个非常常用的数据类型,这一篇记录一些常用用法。
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
dict.has_key()
key in dict.keys()
字典的本质是hash表,一种散列表结构,数据输入后按特征已经被散列了,注定它就是无序的。
所以预先添加的内容输出的顺序是不可预期的。有两种解决方法

先介绍一下 XPath。XPath 是一门在 XML 文档中查找信息的语言。可用来在 XML 文档中对元素和属性进行遍历。
在 selenium 中定位元素,使用 XPath 能更好的抽象代码(比如讲 XPath 表达式提取成一个单独的配置)。所以我在日常使用中尽量使用 XPath。
html 是标记语言,XML 是标记语言的元语言。
HTML和XML的最大区别在于:HTML是一个定型的标记语言,它用固有的标记来描述,显示网页内容。比如<H1>表示首行标题,有固定的尺寸。相对的,XML则没有固定的标记,XML不能描述网页具体的外观,内容,它只是描述内容的数据形式和结构。
本小节节选自 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等直接有方法可调用的属性,也可以查找元素中是否有其他能唯一标识元素的属性,如果有,就可以用此方法定位。
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’,就能匹配成功。缺点,可能会匹配含有这个属性值的其他元素,所以我们在定位的时候要查看一下这个元素值在页面中是否唯一。
选自 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
# 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
| 表达式 | 描述 |
|---|---|
| nodename | 选取此节点的所有子节点。 |
| / | 从根节点选取。 |
| // | 匹配任意多的节点,而不考虑它们的位置。 |
| . | 选取当前节点。 |
| .. | 选取当前节点的父节点。 |
| @ | 选取属性。 |
谓语用来查找某个特定的节点或者包含某个指定的值的节点。
| 路径表达式 | 结果 |
|---|---|
| /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中的一切都是对象,它们要么是类的实例,要么是元类的实例 .

在图中可以看出对象分两种:
虚线表示一个对象的type(类型),实线表示一个对象的base(基类/父类).
首先我们要明确,类创造了实例,而不是继承关系。那么问题来了,是什么创造了类呢? Python 引进了metaclasses,<type 'type'>就是元类,它可以创建类.
可以参考一下这些链接:
由于历史原因,2.x 里 object 是新基类,需要显示定义。在3.x里,object已经默认做为所有东西的基类了。
class A: # 旧式类
pass
class B(object): # 新式类
pass
两个方法:
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)
那么问题来了,为什么要加入新式类呢?
新式类有很多优势:
定义了一些特殊方法,子类可以对这些方法进行覆盖以满足自身的特殊需求.
`__new__()`
`__init__()`
`__delattr__()`
`__getattribute__()`
`__setattr__()`
`__hash__()`
`__repr__()`
`__str__()`
另外新式类和旧式类还有一个区别就是在多继承的时候,查找要调用的方法。新式类是广度优先的查找算法。旧式类的查找方法是深度优先的.