XPath
全称XML Path Language,是一门在XML文档中查找信息的语句,可用来在XML文档中对元素和属性进行遍历。“官方文档w3xpath”
安装(windows)
~~pip install lxml~~ 豆瓣源 ![pip install -i https://pypi.doubanio.com/simple/ lxml
XML和 HTML 的区别
数据格式 | 描述 | 作用 |
---|---|---|
XML | 可扩展标记语言 | 用来传输和存储数据 |
HTML | 超文本标记语言 | 用来显示数据 |
常见语法
表达式 | 含义 |
---|---|
/ | 从根节点开始 |
// | 从任意节点 |
. | 从当前节点 |
… | 从当前节点的父节点 |
@ | 选取属性 |
text() | 选取文本 |
常用用法
from lxml import etree
data = """
<div>
<ul>
<li class="item-0"><a href="link1.html">first item</a></li>
<li class="item-1"><a href="link2.html">second item</a></li>
<li class="item-inactive"><a href="link3.html">third item</a></li>
<li class="item-1" id="1" ><a href="link4.html">fourth item</a></li>
<li class="item-0" data="2"><a href="link5.html">fifth item</a>
</ul>
</div>
"""
html = etree.HTML(data)#构造了一个XPath解析对象。etree.HTML模块可以自动修正HTML文本。
li_list = html.xpath('//ul/li')#选取ul下面的所有li节点
#li_list = html.xpath('//div/ul/li')#选取ul下面的所有li节点
print(li_list)
a_list = html.xpath('//ul/li/a')#选取ul下面的所有a节点
print(a_list)
herf_list = html.xpath('//ul/li/a/@href')#选取ul下面的所有a节点的属性herf的值
print(herf_list)
text_list = html.xpath('//ul/li/a/text()')#选取ul下面的所有a节点的值
print(text_list)
通配符
通配符 | 含义 |
---|---|
* | 选取任何元素节点 |
@* | 选取任何属性的节点 |
li_list = html.xpath('//li[@class="item-0"]')#选取class为item-0的li标签
print(li_list)
text_list = html.xpath('//li[@class="item-0"]/a/text()')#选取class为item-0的li标签 下面a标签的值
print(text_list)
li1_list = html.xpath('//li[@id="1"]')#选取id属性为1的li标签
print(li1_list)
li2_list = html.xpath('//li[@data="2"]')#选取data属性为2的li标签
print(li2_list)
表达式
表达式 | 含义 |
---|---|
[?] | 选取第几个节点 |
last() | 选取最后一个节点 |
last()-1 | 选取倒数第二个节点 |
position()-1 | 选取前两个 |
li_list = html.xpath('//ul/li[1]') # 选取ul下面的第一个li节点
print(li_list)
li1_list = html.xpath('//ul/li[last()]') # 选取ul下面的最后一个li节点
print(li1_list)
li2_list = html.xpath('//ul/li[last()-1]') # 选取ul下面的最后一个li节点
print(li2_list)
li3_list = html.xpath('//ul/li[position()<= 3]') # 选取ul下面前3个标签
print(li3_list)
text_list = html.xpath('//ul/li[position()<= 3]/a/@href') # 选取ul下面前3个标签的里面的a标签里面的href的值
print(text_list)
函数
函数名 | 含义 |
---|---|
starts-with | 选取以什么开头的元素 |
contains | 选取包含一些信息的元素 |
and | 并且的关系 |
or | 或者的关系 |
li_list = html.xpath('//li[starts-with(@class,"item-1")]')#获取class包含以item-1开头的li标签
print(li_list)
li1_list = html.xpath('//li[contains(@class,"item-1")]')#获取class包含item的li标签
print(li1_list)
li2_list = html.xpath('//li[contains(@class,"item-0") and contains(@data,"2")]')#获取class为item-0并且data为2的li标签
print(li2_list)
li3_list = html.xpath('//li[contains(@class,"item-1") or contains(@data,"2")]')#获取class为item-1或者data为2的li标签
print(li3_list)