python Xpath
XPath介绍:
是什么? 全称为XML Path Language 一种小型的路径查询语言
您可以将 Xpath 理解为在xml/html文档中检索、匹配元素节点的工具。
说到XPath是门语言,不得不说它所具备的优点:
(1) 可在XML中查找信息
(2) 支持HTML的查找
(3) 通过元素和属性进行导航
python开发使用XPath条件:
由于XPath属于lxml库模块,所以首先要安装库lxml
选取节点:
基本语法知识:
| 表达式 | 描述 | 示例 |
| :————————: | :———————————————-: | :————————————————-: |
| **// ** 双斜杠 | 定位根节点,不考虑起始位置,会对全文进行扫描,在文档中选取所有符合条件的内容,以列表的形式返回。 | //div[@id=“one”]/p /html/body//p |
| / 单斜杠 | 寻找当前标签路径的下一层路径标签或者对当前路标签内容进行操作 | /html/body/div/ |
| /text() | 获取当前路径下的文本内容 | /html/body/div/p/text() |
| /@xxx /[@xxx=” “] | 提取当前路径下标签的属性值—-在中括号中则为选取条件 | /html/body/div[@id=“one”]/p/@class |
| . 点 | 选取当前节点 | |
| .. 双点 | 选取当前节点的父节点 | |
| div[n] | n为下标,表示该节点是父节点下的第几个 | /div[2]/p |
| * 星号 | 匹配任意节点 | /div/*/span/text() |
路径表达式的含义:
| bookstore | 选取 bookstore 元素的所有子节点。 |
| :—————————————————: | :—————————————————: |
| bookstore/book | 选取 bookstore下面(子元素中)的所有 book 元素 |
| //book | 选取所有的book元素,在整个文档中全局匹配符合表达式的节点。 |
| bookstore//book | 选取bookstore下面(子元素中)所有的book元素 |
| //@lang | 选取名为 lang 的所有属性。 |
| /bookstore/book[1] | 选取属于 bookstore 子元素的第一个 book 元素。 |
| /bookstore/book[last()] | 选取属于 bookstore 子元素的最后一个 book 元素。 |
| /bookstore/book[last()-1] | 选取属于 bookstore 子元素的倒数第二个 book 元素。 |
| /bookstore/book[position()<5] | 选取属于 bookstore 下面(子元素中)的前四个 book 元素。 |
| //title[@lang] | 选取所有属性名为 lang 的 title 元素。 |
| //title[@class=‘content’] | 选取所有属性名为 class并且值=“content"的 title 元素。 |
| /bookstore/book[price>35.00] | 选取 bookstore 元素下的所有 book 元素,且其中的 price 元素的值须大于 35.00。 |
| * | 匹配任何元素节点。 |
| @* | 匹配任何属性节点。 |
| node() | 匹配任何类型的节点。 |
| /bookstore/* | 选取 bookstore 元素的所有子元素。 |
| //* | 选取文档中的所有元素。 |
| //title[@*] | 选取所有带有属性的 title 元素。 |
| //title I //price | 选取文档中的所有 title 和 price 元素。 |
| //div[contains(@class,“a”)] | 选取所有class值包含a的div元素 |
| //div[contains(@class,“a”) and contains(@class,“b”)] | 选取所有class值包含a和b的div元素 |
| //input[@type=‘submit’ and @name=‘fuck’] | 选取文档中所有属性type值=“submit"且属性name值=‘fuck’ 的input元素。 |
| //input[@type=‘submit’ or @name=‘fuck’] | 选取文档中所有属性type值=“submit"或属性name值=‘fuck’ 的input元素。 |
创建对象使用语法:
将HTML 或 XML 字符串或文档,给etree,用一个变量去接收,从而创建一个解析对象
from lxml import etree
t="""
<html>
<body>
<div>
<p>hello,world</p>
<div>
</body>
</html/
"""
#将字符串或文档给etree进行初始化
# HTML文档
t = etree.HTML(t)
# XML文档
t = etree.XML(xxx)
# parse 可以加载文件
t = etree.parse("xxx.txt")
# 此时可以进行xpath路径查找
s = t.xpath("###xpath路径###")
练习:
t1="""
<html>
<meta charset=UTF-8">
<title>lxy</title>
<head></head>
<body>
<h1 class="ccc">lxy的xpath测试</h1>
<div id="t1">
<p>python</p>
</div>
<div id="t2">
<p>哇哇哇哇哇哇哇</p>
</div>
<h1 class="ccc">金发妹和大山</h1>
<div id=""t3 class="dd"><p>啊嘎嘎让</p></div>
<div class="dd"><p id="FBL">小妹小帅和FBL</p></div>
<div><span>对外经济嗡嗡嗡</span></div>
</body>
</html>
"""
# 创建xpath解析对象
html = etree.HTML(t1)
# // 双斜杠 任意节点 或者 对全文进行扫描,返回符合条件的内容
print(html.xpath('/html/body//p/text()'))
print(html.xpath('//div/p/text()'))
# * 星号 表示任意节点
print(html.xpath('/html/body/*/span/text()'))
# @xxx [ ] 属性值 和 [ ]
print(html.xpath('/html/body/div[@class="dd"]/p/text()'))
print(html.xpath('/html/body/div[@class="dd"]/p/@id'))
=============================================================================
运行结果:
['python', '哇哇哇哇哇哇哇', '啊嘎嘎让', '小妹小帅和FBL']
['python', '哇哇哇哇哇哇哇', '啊嘎嘎让', '小妹小帅和FBL']
['对外经济嗡嗡嗡']
['啊嘎嘎让', '小妹小帅和FBL']
['FBL']
评论区