一 XPath
1.0样例:
<?xml version="1.0" encoding="ISO-8859-1"?> <bookstore> <book> <title lang="eng">Harry Potter</title> <price>29.99</price> </book> <book> <title lang="eng">Learning XML</title> <price>39.95</price> </book> </bookstore> |
1.1语法
表达式 |
描述 |
nodename |
选取此节点的所有子节点 |
/ |
从根节点选取 |
// |
任意节点,不考虑位置 |
. |
当前节点 |
.. |
当前节点的父节点 |
@ |
选取属性 |
* |
匹配任何节点 |
1.2补充
表达式 |
描述 |
contains(@属性,”包含的内容”) |
模糊查询 |
text() |
取文本内容 |
last() |
数目 |
1.3路径表达式
路径表达式 |
结果 |
bookstore |
选取bookstore元素的所有子孙节点 |
/bookstore |
从根元素找bookstore |
bookstore/book |
bookstore 的子节点中book元素。 |
//book |
忽略位置查找book节点 |
bookstore//book |
bookstore下子孙节点查找book |
@lang |
lang属性的属性值 |
注意:xpath中的索引是从1开始的
1.4例子
表达式 |
结果 |
/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。 |
1.5百度贴吧案例
//div[@class="threadlist_title pull_left j_th_tit"]/a[1]/@href //div[contains(@class,"threadlist_title pull_left j_th_tit")]/a[1]/@href //span[@class="threadlist_rep_num center_text"]/text() |
1.6python中使用xpath
# 1.导包 from lxml import etree as le # 2.准备好str类型的文本对象 html = ‘…’ # str类型的文本对象 # 3.把str对象加载成xpath对象 html_x = le.HTML(html) # 4.使用xpath表达式 ret = html_x.xpath(‘xpath表达式’) |
二 json模块
2.1 loads() json转python
list_json = '[1,2,3,4]' |
注意:
dict_json = '{"key":true}' |
2.2 load() 本地json转python
ret = json.load(open(“filepath”)) |
2.3dumps() python转json
list_ = [1,2,3,4] |
2.4dump() 写入本地文件
dict_ = {"key1":{"k1":"v1","k2":"v2"},"key2":{"k1":"v1","k2":"v2"}} json.dump(dict_,open('a.json','w'),ensure_ascii=False |
三 jsonpath
3.1 xpath语法与jsonpath的对比
描述 |
xpath |
jsonpath |
根元素 |
/ |
$ |
当前元素 |
. |
@ |
子元素 |
/ |
.或者[] |
父元素 |
.. |
无 |
不计位置 |
// |
.. |
通配符,所有元素 |
* |
* |
属性 |
@ |
无 |
子元素操作符 |
[] |
[] |
或 |
| |
[XXX,XXX,XXX] |
元素分割 |
无 |
[start:end] |
过滤表达式 |
[] |
?() |
脚本表达式 |
无 |
() |
分组 |
() |
无 |
3.2语法样例
{ "store": { "book": [ { "category": "reference", "author": "班长", "title": "钢铁是怎么炼成的", "price": 8.95 }, { "category": "fiction", "author": "小深", "title": "西游记", "price": 12.99 }, { "category": "fiction", "author": "小王", "title": "红楼梦", "isbn": "0-553-21311-3", "price": 8.99 }, { "category": "fiction", "author": "生委", "title": "论吃饭的重要性", "isbn": "0-395-19395-8", "price": 22.99 } ], "bicycle": { "color": "red", "price": 19.95 } } } |
xpath |
jsonpath |
描述 |
/store/book/author |
$.store.book[*].author |
所有书的作者 |
//author |
$..author |
所有的作者 |
/store/* |
$.store.* |
store的所有元素 |
/store//price |
$.store..price |
store里面所有东西的price |
//book[3] |
$..book[2] |
第三个书的节点 |
//book[last()] |
$..book[(@.length-1)] |
最后一本书 |
//book[position()<3] |
$..book[0,1] $..book[0:2] $..book[:2] |
前面的两本书。 |
//book[@isbn] |
$..book[?(@.isbn)] |
过滤出所有的包含isbn的书。 |
//book[price<10] |
$..book[?(@.price<10)] |
过滤出价格低于10的书。 |
//* |
$..* |
所有元素。 |
3.3 python中使用jsonpath
import jsonpath ret = jsonpath.jsonpath(obj,’表达式’) |