一、xpath 常用规则
二、在python的安装使用
python3环境下安装命令
pip install lxml
三、实践
1、常用数据的导入
(1) 通过html文件导入
html = etree.parse('./index.html',etree.HTMLParser())
result = etree.tostring(html)
print(result.decode('utf-8'))
( 2)通过字符串转成html格式
用lxml解析html,利用etree.HTML解析字符串将字符串解析从html格式的文件, 经过处理后,部分缺失的节点可以自动修复,并且还自动添加了 body、html 节点
text = '''
<ul>
<li class="item-0"><a href="https://s1.bdstatic.com/">item 0 </a></li>
<li class="item-1"><a href="https://s2.bdstatic.com/">item 1 </a></li>
<li class="item-2"><a href="https://s3.bdstatic.com/">item 2 </a></li>
<li class="item-3"><a href="https://s4.bdstatic.com/">item 3 </a></li>
<li class="item-4"><a href="https://s5.bdstatic.com/">item 4 </a></li>
<li class="item-5"><a href="https://s6.bdstatic.com/">item 5 </a></li>
</ul>
'''
html = etree.HTML(text)
s = etree.tostring(html).decode()
print(s)
2、通过绝对路径查找
(1)获取某个标签的文本内容
方式一:
html_data = html.xpath('/html/body/ul/li/a')
for i in html_data:
print(i.text)
# 方式二
html_data = html.xpath('/html/body/ul/li/a/text()')
print(html_data)
for i in html_data:
print(i)
(2)通过@xx获取属性
html_data = html.xpath('/html/body/ul/li/a/@href')
print(html_data)
for i in html_data:
print(i)
(3)通过[]获取指定属性标签的文本内容
html_data = html.xpath('/html/body/ul/li/a[@href="https://s1.bdstatic.com/"]/text()')
print(html_data)
3、通过相对路径获取内容
(1)获取标签内容
html_data = html.xpath('//li/a/text()')
print(html_data)
(2)获取标签属性
html_data = html.xpath('//li/a/@href')
print(html_data)
(3)获取指定属性标签的内容
html_data = html.xpath('//li/a[@href="https://s1.bdstatic.com/"]/text()')
print(html_data)
(4)获取指定索引的标签内容
html_data = html.xpath('//li[1]/a/text()')
print(html_data)
4、子节点
通过 / 或 // 即可查找元素的子节点或子孙节点。
选择 li 节点的所有直接 a 子节点xpath为://li/a
5、父节点
html_data = html.xpath('//a[@href="https://s3.bdstatic.com/"]/../@class')
print(html_data)
6、常用属性
(1)匹配属性
标签[@属性=“”]
# 匹配属性
html_data = html.xpath('//a[@href="https://s1.bdstatic.com/"]/text()')
print(html_data)
(2)获取文本
@text()
# 匹配属性
html_data = html.xpath('//a[@href="https://s1.bdstatic.com/"]/text()')
print(html_data)
(3)获取属性
/@属性
# 获取属性
html_data = html.xpath('//li/a/@href')
print(html_data)
(4) 属性多值匹配
[contains(@属性,"值")]
html_data = html.xpath('//li[contains(@class, "a")]/a/text()')
print(html_data)
(5)多属性匹配
html_data = html.xpath('//li[contains(@class, "a") and
contains(@name,"1")]/a/text()')
print(html_data)
(6)last 函数
# 获取最后一个
result = html.xpath('//li[last()]/a/text()')
print(result)
# 获取倒数第三个
result = html.xpath('//li[last()-2]/a/text()')
print(result)
(7)position函数
# 获取前两个
result = html.xpath('//li[position()<3]/a/text()')
print(result)
(8)中括号获取
# 获取第一个
result = html.xpath('//li[1]/a/text()')
print(result)