XPath是一门在XML文档中查找信息的语言,可以用来在XML文档对元素和属性进行遍历,而我们熟知的HTML恰好属于XML的一个子集
安装xpath
在python中想要使用xpath,需要安装lxml模块
pip install lxml
导入xpath
from lxml import etree
from lxml import html
etree=html.etree
导入的方式有两种,如果第一种报错,就使用第二种
xpath处理XML
数据准备
xmlData = """
<book>
<id>1</id>
<name>野花遍地香</name>
<price>1.23</price>
<nick>臭豆腐</nick>
<author>
<nick id="10086">周大强</nick>
<nick id="10010">周芷若</nick>
<nick class="jay">周杰伦</nick>
<nick class="jolin">蔡依林</nick>
<div>
<nick>惹了</nick>
</div>
</author>
<partner>
<nick id="ppc">胖胖陈</nick>
<nick id="ppbc">胖胖不陈</nick>
</partner>
</book>
"""
数据解析
查找子节点
首先对字符串进行初始化
et= etree.XML(xml)
接着找到book根节点
result=et.xpath("/book")
斜杠表示的就是根节点
如果想找到book下面的name子节点,可以用下面的代码
result=et.xpath("/book/name")
中间的斜杠表示的是子节点
取节点文本
如果想要取到name里面的文本,则可以
result=et.xpath("/book/name/text()")
输出如下:
E:\pyproject\test\Scripts\python.exe E:\pyproject\test\main.py
['野花遍地香']
这个返回的是个列表,如果只想获取文本内容,那么直接用取下标的方式即可
如果想要找到多个nick标签
result = et.xpath("/book//nick")
打印结果如下
E:\pyproject\test\Scripts\python.exe E:\pyproject\test\main.py
[<Element nick at 0x1e24828>, <Element nick at 0x1e24848>, <Element nick at 0x2043c28>, <Element nick at 0x2043e28>, <Element nick at 0x2043cc8>, <Element nick at 0x2043dc8>, <Element nick at 0x2043ec8>, <Element nick at 0x2043f48>]
两个斜杠,表示的是找所有的子节点
通过属性筛选数据
<author>
<nick id="10086">周大强</nick>
<nick id="10010">周芷若</nick>
<nick class="jay">周杰伦</nick>
<nick class="jolin">蔡依林</nick>
<div>
<nick>惹了</nick>
</div>
</author>
在一个节点下面,通过都会用很多个相同的标签,这个时候如果想拿到单独的某一个,就可以通过属性来筛选
result = et.xpath("/book//author/nick[@class='jay']/text()")
输出结果如下:
E:\pyproject\test\Scripts\python.exe E:\pyproject\test\main.py
['周杰伦']
进程已结束,退出代码为 0
这里可以通过中括号的方式对属性进行筛选,格式为@属性名=值
取节点属性
如果想要取到某一个节点的属性值,而不是文本内容,那么可以用下面的方式
result = et.xpath("/book/partner/nick/@id")
输出结果如下:
E:\pyproject\test\Scripts\python.exe E:\pyproject\test\main.py
['ppc', 'ppbc']
直接用@加属性名字,就可以拿到属性值
xpath处理HTML
数据准备
html = """
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>Title</title>
</head>
<body>
<ul>
<li><a href="http://www.baidu.com">百度</a></li>
<li><a href="http://www.google.com">谷歌</a></li>
<li><a href="http://www.sogou.com">搜狗</a></li>
</ul>
<ol>
<li><a href="feiji">飞机</a></li>
<li><a href="dapao">大炮</a></li>
<li><a href="huoche">火车</a></li>
</ol>
<div class="job">李嘉诚</div>
<div class="common">胡辣汤</div>
</body>
</html>
"""
提取数据
首先加载html文本
et=etree.HTML(html)
“huoche”>火车
李嘉诚
胡辣汤
“”"
#### 提取数据
首先加载html文本
```python
et=etree.HTML(html)
数据提取的方式和xml一样,也是一层一层往下找