开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第20天,点击查看活动详情
xpath
简介
XPath即为XML路径语言(XML Path Language),它是一种用来确定XML文档中某部分位置的语言。
XPath基于XML的树状结构,提供在数据结构树中找寻节点的能力。起初XPath的提出的初衷是将其作为一个通用的、介于XPointer与XSL间的语法模型。但是XPath很快地被开发者采用来当作小型查询语言。
点击 → 查看更多
插件安装
- 浏览器插件
下载 XPath Helper 并安装到浏览器,安装完成之后重启浏览器,当看到小黑框时则表示安装成功。(唤起快捷键Ctrl + Shift + X)
- 安装
lxml库
pip install lxml -i https://pypi.douban.com/simple
基本使用
- 导入
lxml.etree
from lxml import etree
- 解析本地文件
etree.parse()
- 服务器响应文件
etree.HTML(response.read().decode('utf-8'))
- xpath
基本语法
演示页面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8"/>
<title>xpath基本使用</title>
</head>
<body>
<ul>
<li>北</li>
<li>上</li>
<li>广</li>
<li>深</li>
</ul>
</body>
</html>
- 路径查询
- //:查找所有子孙节点,不考虑层级
- /:只找子节点
from lxml import etree
tree = etree.parse("xpath基本使用.html")
# 不考虑层级
li_list = tree.xpath("//body//li")
print(len(li_list))
# 只查找子级
li_list = tree.xpath("//body/li")
print(len(li_list))
ps: 有的小伙伴可能直接把对象打印出来了,却发现并不是你想要的内容是吧?要查看内容的可以直接跳到第5点内容查看。
- 谓词查询
- //div[@id]:找到带有id属性的标签
- //div[@id="l1"]:找到带有id属性,且值为
l1的标签
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8"/>
<title>xpath基本使用</title>
</head>
<body>
<ul>
<li id="l1">北</li>
<li id="l2">上</li>
<li>广</li>
<li>深</li>
</ul>
</body>
</html>
# 查找带有id属性的标签
li_list = tree.xpath("//body//li[@id]/text()")
print(li_list)
# 找到带有id属性,且值为`l1`的标签
li_list = tree.xpath("//body//li[@id='l1']/text()")
print(li_list)
- 属性查询
- //@class:获取标签的
class属性值
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8"/>
<title>xpath基本使用</title>
</head>
<body>
<ul>
<li id="l1" class="bei">北</li>
<li id="l2">上</li>
<li>广</li>
<li>深</li>
</ul>
</body>
</html>
from lxml import etree
tree = etree.parse("xpath基本使用.html")
li_list = tree.xpath("//body//li[@id='l1']/@class")
print(li_list)
- 模糊查询
- //div[contains(@id, "b")]:查找标签中
id属性包含b的标签 - //div[starts-with(@id, "l")]:查找标签中
id属性以l开头的标签
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8"/>
<title>xpath基本使用</title>
</head>
<body>
<ul>
<li id="l1" class="bei">北</li>
<li id="l2">上</li>
<li id="b1">广</li>
<li id="b2">深</li>
</ul>
</body>
</html>
# 查找标签中`id`属性包含`b`的标签
li_list = tree.xpath("//body//li[contains(@id, 'b')]/text()")
print(li_list)
# 查找标签中`id`属性以`l`开头的标签
li_list = tree.xpath("//body//li[starts-with(@id, 'l')]/text()")
print(li_list)
- 内容查询
- //div/h1/text():显示标签内容
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8"/>
<title>xpath基本使用</title>
</head>
<body>
<ul>
<li id="l1" class="bei">北</li>
<li id="l2">上</li>
<li id="b1">广</li>
<li id="b2">深</li>
</ul>
</body>
</html>
from lxml import etree
tree = etree.parse("xpath基本使用.html")
li_list = tree.xpath("//body//li/text()")
print(li_list)
- 逻辑运算
- //div[@id="l1" and @class="bei"]:查找两个条件同时成立的标签
- //div1 | //div2:查找符合条件的标签
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8"/>
<title>xpath基本使用</title>
</head>
<body>
<ul>
<li id="l1" class="bei">北</li>
<li id="l2">上</li>
<li id="b1">广</li>
<li id="b2">深</li>
</ul>
<span>SPAN</span>
</body>
</html>
# 查找两个条件同时成立的标签
li_list = tree.xpath("//body//li[@id='l1' and @class='bei']/text()")
print(li_list)
# 查找符合条件的标签
li_list = tree.xpath("//body//li[@id='l1']/text() | //body//span/text()")
print(li_list)