1. Xpath解析
1.1 XPth
XPth:是一门在XML文档中查找内容的语言。
XML文档:存储和传输数据的。 --> json数据。
1.2 json和XML区别
1)json数据对机器友好型语言。
2)XML对人类友好型语言。
1.3 XPath根据什么在XML查找内容
1)XML文档中有很多节点。例如:根节点(文档节点)、属性节点、内容节点、元素节点等。
2)xml文档是树形结构。
xml_str = """
<supermarket> --> 根节点(文档节点)
<name>永辉超市</name> --> 元素节点
<address>中国</address> --> 中国,内容节点
<address name="one">四川成都</address>
<address name="two">肖家河大厦</address>
<goodsList>
<goods name="泡面" price="3.5" count="20"></goods> -->name="泡面",属性节点
<goods name="矿泉水" price="2" count="50"></goods>
<goods name="面包" price="5" count="15"></goods>
</goodsList>
<worker_list>
<cashier name="张三" pay="4000"></cashier>
<shoppingGuide name="李四" pay="3500"></shoppingGuide>
</worker_list>
<goods price="50" count="15">
<name>烟</name>
</goods>
</supermarket>
"""
2. XPath语法
2.1 etree.HTML(字符串类型HTML页面源代码)
etree.HTML(字符串类型HTML页面源代码):将HTML页面源码转换成_Element类型。
2.2 etree.XML(字符串类型的XML源码)
etree.XML(字符串类型的XML源码):将XML文档源码转换成_Element类型。
# 1. 页面源代码转换类型
root = etree.XML(xml_str)
print(root, type(root))
# <Element supermarket at 0x1bbf089fec0> <class 'lxml.etree._Element'>
2.3 XPth路径选择器语法
XPth语法:
1) . :表示当前节点
2) … :表示当前节点的父节点
3) / :表示的是当前文档的根节点
4) // :表示的是当前节点的任意位置节点
5) text():获取节点中的内容
6) @ :获取节点中的属性值
2.4 XPth提取页面信息
1)supermarket - 获取文档中名字叫做supermarket子节点
print(root.xpath('supermarket')) # []
2)/supermarket - 获取文档根节点supermarket
print(root.xpath('/supermarket')) # [<Element supermarket at 0x1bbf089fec0>]
3)//name - 获取当前节点下的任意name节点
print(root.xpath('//name')) # [<Element name at 0x1d85ca8f340>, <Element name at 0x1d85ca8f300>]
4)//name/text() - 获取当前节点下的任意name节点中的内容
print(root.xpath('//name/text()')) # ['永辉超市', '烟']
5)/supermarket/goodsList/goods - 获取supermarket根节点下goodsList字节点的goods子节点
print(root.xpath('/supermarket/goodsList/goods')) # [<Element goods at 0x16a45caf3c0>, <Element goods at 0x16a45caf400>, <Element goods at 0x16a45caf380>]
6)/supermarket/goodsList/goods/@name
print(root.xpath('/supermarket/goodsList/goods/@name')) # ['泡面', '矿泉水', '面包']
7).
goods_list = root.xpath('/supermarket/goodsList/goods')
print(goods_list)
for i in goods_list:
print(i.xpath('./@name'))
8)… - 获取当前文档中任意位置的cashier节点的父节点
print(root.xpath('//cashier/..')) # [<Element worker_list at 0x1ddcd99f540>]
2.5 谓语
谓语 - 给xpath路径选择器添加精确条件。
1)/supermarket/goodsList/goods[1]/@name - 获取supermarket根节点下goodsList子节点的第一个goods节点的name属性值
print(root.xpath('/supermarket/goodsList/goods[1]/@name')) # ['泡面']
2)/supermarket/goodsList/goods[1]/@name - 获取supermarket根节点下goodsList子节点的最后一个goods节点的name属性值
print(root.xpath('/supermarket/goodsList/goods[last()]/@name')) # ['面包']
3)/supermarket/goodsList/goods[1]/@name - 获取supermarket根节点下goodsList子节点的倒数第二个goods节点的name属性值
print(root.xpath('/supermarket/goodsList/goods[last()-1]/@name')) # ['矿泉水']
4)//goods[@name] - 获取当前节点中带有name属性的goods
print(root.xpath('//goods[@name]')) # [<Element goods at 0x25357fa0380>, <Element goods at 0x25357fa02c0>, <Element goods at 0x25357fa0240>]
5)//goods[@name] - 获取当前节点中带有name属性是矿泉水的goods
print(root.xpath('//goods[@name="矿泉水"]')) # [<Element goods at 0x25357fa02c0>]