XPath语法

XPath语法 XPath是在XML中检索信息的语言,也就是遍历XML文档,找出有用的信息。这里记录下XPath的语法 选取节点 XPath 使用路径表达式在 XML 文档中选取节点。节点是通过沿着路径或者 step 来选取的。 表达式 描述 nodename 选取此节点的所有子节点 / 从根节点选取 // 从整个文档选取,不考虑它们的位置 . 选取当前节点 .. 选取当前节点的父节点 @ 选取属性 实例 <?xml version="1.0" encoding="UTF-8"?> <bookstore> <book category="cooking"> <title lang="en">Everyday Italian</title> <author>Giada De Laurentiis</author> <year>2005</year> <price>30.00</price> </book> <book category="children"> <title lang="zh">哈利波特</title> <author>J K. Rowling</author> <year>2005</year> <price>29.99</price> </book> <book category="web"> <title lang="en">XQuery Kick Start</title> <author>James McGovern</author> <author>Per Bothner</author> <author>Kurt Cagle</author> <author>James Linn</author> <author>Vaidyanathan Nagarajan</author> <year>2003</year> <price>49.99</price> </book> <book category="web" cover="paperback"> <title lang="en">Learning XML</title> <author>Erik T. Ray</author> <year>2003</year> <price>39.95</price> </book> </bookstore> 路径表达式 结果 bookstore 选取 bookstore 元素的所有子节点 /bookstore 选取根元素 bookstore/book 选取属于 bookstore 的子元素的所有 book 元素 //book 选取所有 book 子元素,而不管它们在文档中的位置 bookstore//book 选择属于 bookstore 元素的后代的所有 book 元素,而不管它们位于 bookstore 之下的什么位置。 //@lang 选取名为 lang 的所有属性 使用上面的xml文档作为测试,node.js可以使用xpath,Python可以使用lxml库 ...

June 1, 2018 · 2 min · 372 words · Fython

使用usb转TTL(PL2303模块) 串口连接树莓派3B

使用 usb 转 TTL(PL2303 模块) 串口连接树莓派 3B By default, on Raspberry Pis equipped with the wireless/Bluetooth module (Raspberry Pi 3 and Raspberry Pi Zero W), the PL011 UART is connected to the BT module, while the mini UART is used for Linux console output. On all other models the PL011 is used for the Linux console output. 在树莓派 3 以前,官方是将“硬件串口”分配给 GPIO 中的 UART(GPIO14&GPIO15),因此可以独立调整串口的速率和模式,直接连接就可以。而在 3 以后的树莓派中因为新增了蓝牙使用掉了 UART。这样默认就不开启了,以下是手动开启的方法。 使用 HDMI 启动树莓派编辑/boot/config.txt在后面新增以下两行 # 激活串口输出 enable_uart=1 # 禁用蓝牙 dtoverlay=pi3-disable-bt 运行sudo systemctl disable hciuart禁用蓝牙服务,然后重启 ...

April 2, 2018 · 1 min · 120 words · Fython

collections模块中的namedtuple和defaultdict

collections模块中的namedtuple和defaultdict collections模块是Python中对内置类型(dict, list, tuple)的拓展。就是说它们本身具有普通内置类型的所有特性,并添加了新的功能。 namedtuple() namedtuple(typename, field_names)是tuple的子类,定义的元组可以通过属性访问,也易于理解,self-document。field_names可以是列表或者是通过空格或者逗号分隔的字符串。 >>> from collections import namedtuple >>> Point = namedtuple('point', 'x, y') >>> p = Point(3, y=4) >>> p point(x=3, y=4) >>> p[0] 3 >>> p.x 3 >>> x, y = p >>> print(x, y) 3 4 namedtuple有几个比较有用的方法和属性 SomeNamedTuple._make(iterable)类方法,从可迭代对象中取值,长度必须和传入的field_names一致,返回一个新的对象 somenamedtuple._asdict()方法返回一个有序字典(OrderedDict) somenamedtuple._replace(**kwargs)方法替换值,返回一个新的对象,原来的不变 somenamedtuple._fields属性返回键名(field name),可用于创建新的named tuple 再来看两个官方文档上的例子读取csv文件或者从sqlite读取 EmployeeRecord = namedtuple('EmployeeRecord', 'name, age, title, department, paygrade') import csv for emp in map(EmployeeRecord._make, csv.reader(open("employees.csv", "rb"))): print(emp.name, emp.title) import sqlite3 conn = sqlite3.connect('/companydata') cursor = conn.cursor() cursor.execute('SELECT name, age, title, department, paygrade FROM employees') for emp in map(EmployeeRecord._make, cursor.fetchall()): print(emp.name, emp.title) defaultdict defaultdict([default_factory[,...]])顾名思义继承自dict它接收一个函数(default_factory)作为参数但它除了dict所有的属性和方法外,另外加了__missing__方法和default_factory属性。这两个的作用就是访问不存在的key时它会新增一个key,value为调用default_factory的值。 >>> from collections import defaultdict >>> d = defaultdict(list) # 默认函数为list >>> print(d.items()) # 创建空字典 dict_items([]) >>> d.default_factory <class 'list'> >>> d['key'] # 调用会设置该key的值为空list并返回 [] >>> print(d.items()) dict_items([('key', [])]) 我们可以利用这个特性来做很多事,比如说给一个包含元组的的列表分类整理。 >>> s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)] >>> d = defaultdict(list) >>> for k, v in s: ... d[k].append(v) >>> sorted(d.items()) [('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])] 上面的代码其实可以用dict的setdefault实现,但效率和可读性差点,如下 ...

February 9, 2018 · 2 min · 244 words · Fython

Python中的特殊方法

Python 中的特殊方法 python 在定义 class 时有很多特殊方法可以定义,它们一般都是以双下划线开头和结尾如__init__、__call__、__lt__、__iter__、__setattr__、__setitem__等,下面将对这些常用方法作一些总结。 class 基本方法 __new__(cls[, ...]) 我们都知道__init__会在类初始化的时候被调用其实它不是第一个被调用的,第一个是__new__会在对象创建的时候被调用,这时还没有实例化所以它的第一个参数是cls。 __init__(self[, ...]) 最常用的类方法不用过多介绍,对象初始化时自动调用,也就是在__new__之后才会调用。第一个参数是self实例本身。有一点要注意的是它不能返回(return)值,不然会报TypeError记住它是用来初始化对象的。 class A: def __new__(cls): print('__new__ called') return super(A, cls).__new__(cls) def __init__(self): print('__init__ called') a = A() 返回如下,注意这是 Python3 的写法默认A继承自object,如果使用 Python2 的需要指定A继承自object基类,使用新类。不然__new__是不会被调用的。 __new__ called __init__ called 需要注意的是上面我们定义了__new__接收类对象(cls),必须返回return super(A, cls).__new__(cls)这个类实例也就是下面方法的self,因为__new__会被首先调用返回实例对象以供下面的方法如__init__这些使用。如果去掉这一句其他方法会返回None。默认未定义__new__方法时,默认返回父类实例super().__new__(cls, *args, **kwargs) __str__(self) 调用print(obj)或str(obj)时返回的字符串是对人类友好的(human readable string)。 __repr__(self) 调用repr(obj)或obj返回的字符串,比较偏向机器。 __format__(self, format_spec) 调用f string或format时调用,format(value, format_spec)相当于value.__format__(format_spec) class Animal: def __init__(self, name): self.name = name def __format__(self, format_spec): if format_spec == 'view': return f"this is {self.name}" else: raise ValueError('invalid format spec.') dog = Animal('Labrador') print(format(dog, "view")) print("{0:view}".format(dog)) print(f"{dog:view}") 三种方式返回都一样如下 ...

January 28, 2018 · 3 min · 588 words · Fython

配置SSH agent 和 SSH agent forwarding转发

0x01. ssh-agent转发 经常使用SSH而且私钥设置了passphrase的同学会遇到一个问题,就是每次登录主机都要输入一遍passphrase会很麻烦,这时ssh-agent命令就有用了。 ssh-agent是OpenSSH默认自带的并且在后台一直运行的daemon。假设已经通过ssh-keygen生成了自己的私钥,可以在GitHub上传公钥后使用ssh -T git@github.com命令测试通过。 $ ssh-agent SSH_AUTH_SOCK=/var/folders/k6/k5s6nj_j2k70jzp7plv120y40000gn/T//ssh-fcn9OCl9La13/agent.2462; export SSH_AUTH_SOCK; SSH_AGENT_PID=2463; export SSH_AGENT_PID; echo Agent pid 2463; 但上面的命令没用,我们需要eval命令导入环境变量 $ eval $(ssh-agent) Agent pid 2533 $ echo $SSH_AGENT_PID 2553 $ echo $SSH_AUTH_SOCK /var/folders/k6/k5s6nj_j2k70jzp7plv120y40000gn/T//ssh-6bHKwvKJ6AO1/agent.2532 ssh-agent已经运行了,最后需要把私钥加入cache。 $ ssh-add ~/.ssh/id_rsa Enter passphrase for /Users/fython/.ssh/id_rsa: Identity added: /Users/fython/.ssh/id_rsa (/Users/fython/.ssh/id_rsa) 可以使用ssh-add -l查看缓存的私钥。现在再登录使用公钥认证的主机不需要输入passphrase了。 这个每次开机都要运行一遍上面的命令好像有点麻烦,值得高兴的是大多数的linux发行版都在登录图形界面时都会启动一个ssh-agent进程,你不需要任何操作,可以使用ps -ef | grep ssh-agent查看。如果你的系统没有这个功能,请在~/.xsession文件中加入: ssh-agent gnome-session Note:请使用你自己的窗口管理器取代gnome-session。 本人使用Arch,i3桌面环境的时候需要在~/.profile中加入才能启用 export $(gnome-keyring-daemon --start --components=secrets,ssh) 0x02. 使用SSH agent forwarding多机器转发 设想一下当你有两台server如A和B,你都可以ssh上去但你已经登入了上了A想从A上面ssh到B又不想将私钥上传到A该怎么办,一个很好的办法是开启ForwardAgent yes。 修改全局配置/etc/ssh/ssh_config或修改个人~/.ssh/config配置推荐第二种,没有就新建文件,然后加入 Host * ForwardAgent yes 最后去A和B服务器上~/.ssh/config也加入如上的配置。现在可以愉快的在A上免密连接到B了,当然在B上面也可以ssh到A,其实只要在服务器配置中加入了ForwardAgent yes这样就能传递了。 0x03. 在MacOS上的设置 由于MacOS上每次开机都会忘记Key,只要在~/.ssh/config中添加如下配置即可和实现上面的效果 Host * AddKeysToAgent yes UseKeychain yes ForwardAgent yes IdentityFile ~/.ssh/id_rsa 或者手动运行ssh-add -K yourkey将key加入到Keychain也可以。 ...

December 27, 2017 · 1 min · 93 words · Fython