XPath、Json、Jsonpath

一 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 '{"key1":{"k1":"v1","k2":"v2"},"key2":{"k1":"v1","k2":"v2"}}'

list_ret json.loads(list_json)
dict_ret json.loads(dict_json)

print(list_ret)
print(type(list_ret))

print(dict_ret)
print(type(dict_ret))

注意

dict_json '{"key":true}'
dict_ret json.loads(dict_json)
print(dict_ret)    # 会把小写的true转成True

dict_json '{"key":True}'
dict_ret json.loads(dict_json) # 会报错
print(dict_ret)

2.2 load()  本地json转python

ret = json.load(open(filepath))

2.3dumps()  python转json

list_ [1,2,3,4]
dict_ {"key1":{"k1":"v1","k2":"v2"},"key2":{"k1":"v1","k2":"v2"}}

list_json json.dumps(list_)
dict_json json.dumps(dict_)

print(list_json)
print(type(list_json))

print(dict_json)
print(type(dict_json))

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,表达式)

 

猜你喜欢

转载自blog.csdn.net/kzl_knight/article/details/107500906