Xpath原本是在可扩展标记语言XML中进行数据查询的一种描述语言,可以很方便的在XML文档中查 询到具体的数据;后续再发展过程中,对于标记语言都有非常友好的支持,如超文本标记语言HTML。
正如在python中有一个内置的re模块用来支持正则表达式
语法一样,python中有一个第三方的lxml模块,可以方便
的支持Xpath的各种操作,可以友好的解析Xpath语法,使
其用于在程序中进行结构化数据筛选。
安装命令: pip install lxml
XPath常用规则
案例
etree大部分节点都在这个函数里面
from lxml import etree
html_DOC="""
<html>
<head>
<title>春晚</title>
</head>
<body>
<h1 name="title">个人简介</h1>
<div name="desc">
<p name="name">姓名:<span>小岳岳</span></p>
<p name="addr">住址:中国 河南</p>
<p name="info">代表作:五环之歌</p>
</div>
"""
#初始化
html=etree.HTML(html_DOC)
#print(type(html)) #<class 'lxml.etree._Element'> 获取的网页只有转化etree的格式才能被xpath解析
#(1) 查询html中div标签下的所有的p标签
print(html.xpath("//div/p"))
#三个标签p是以列表形式展现出来:[<Element p at 0x28b3ac8>, <Element p at 0x28b3a88>, <Element p at 0x28b3b88>]
#(2) 查询第二个p标签的name属性值
print(html.xpath("//div/p[2]/@name"))
#加属性值必须是用@:['addr']
#(3)查询div下的p标签下的span标签内容
print(html.xpath("//div/p/span")[0].text)
#"//div/p/span"得到的结果是[<Element span at 0x28acb08>],内容是Element元素,列表获取第一个元素,转化成text格式:小岳岳
#(4)查询body标签下的h1标签的name属性值
print(html.xpath("//body/h1/@name"))
#['title']
#(5)查询所有的包含name属性,并且name属性值为desc的标签
print(html.xpath("//*[@name='desc']"))
#查询所有的用*
#name='desc'是谓语,放在[]里
#属性值用@
#[<Element div at 0x288db48>]
#(6)查询第一个p标签内的所有文本数据
#string():获取包括子孙标签在内的所有文本数据
#text:只能获取该标签下的文本,不包括子孙标签的文本
print(html.xpath('string(//p[1])'))
print(html.xpath("//p[1]")[0].text) #只能获取第一个元素:姓名: