Python爬虫之xpath的基本使用(解析HTML详细介绍)!
Python爬虫之xpath的基本使用(解析HTML详细介绍)!
文章导航
1.XPath介绍
XPath,全称 XML Path Language,即 XML 路径语言,它是一门在 XML 文档中查找信息的语言。最初是用来搜寻 XML 文档的,但同样适用于 HTML 文档的搜索。所以在做爬虫时完全可以使用 XPath 做相应的信息抽取。
2. XPath 概览
XPath 的选择功能十分强大,它提供了非常简洁明了的路径选择表达式。另外,它还提供了超过 100 个内建函数,用于字符串、数值、时间的匹配以及节点、序列的处理等,几乎所有想要定位的节点都可以用 XPath 来选择。
官方帮助文档:https://www.w3.org/TR/xpath/
3. XPath 常用规则
具体匹配后面会详细的讲解。
4. 安装
1、python3环境下安装命令:pip install lxml
2.pycharm安装
Python安装插件/pycharm安装插件的方法
5.实例学习
5.1.常用数据的导入
5.1.1打开html文件导入
from lxml import etree
html = etree.parse('./test.html', etree.HTMLParser())
result = etree.tostring(html)
print(result.decode('utf-8'))
- 1
- 2
- 3
- 4
- 5
5.1.2通过字符串转换成html格式
用lxml解析html
利用etree.HTML解析字符串
将字符串解析从html格式的文件, 经过处理后,部分缺失的节点可以自动修复,并且还自动添加了 body、html 节点。
Python源码:
# -*- coding: utf-8 -*-
# 作者: 废人一枚
# 出自: 北京
# 创建时间: 10:11
import os, traceback
from lxml import etree
text = '''
<p>
<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>
</p>
'''
# 利用 etree.HTML 把字符串解析成 HTML 文件
html = etree.HTML(text)
#decode() 方法将其转化为 str 类型
s = etree.tostring(html).decode()
print(s)
输出为:
5.2 绝对路径查找
- 获取某个标签的内容
注意,获取a标签的所有内容,a后面就不用再加正斜杠,否则报错。
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()')
for i in html_data:
print(i.text)
- 1
- 2
- 3
- 打印指定路径下a标签的属性
这里可以通过遍历拿到某个属性的值,查找标签的内容,通过@属性名获取
html = etree.HTML(text)
html_data = html.xpath('/html/body/ul/li/a/@href')
for i in html_data:
print(i)
- 1
- 2
- 3
- 4
- 获取指定标签对应属性值的内容
使用xpath拿到得都是一个个的ElementTree对象,如果需要查找内容的话,还需要遍历拿到数据的列表。
查到绝对路径下a标签属性等于https://s4.bdstatic.com/的内容。
html = etree.HTML(text)
html_data = html.xpath('/html/body/ul/li/a[@href="https://s4.bdstatic.com/"]/text()')
for i in html_data:
print(i)
- 1
- 2
- 3
- 4
5.3 相对路径查找(常用)
- 查找所有li标签下的a标签内容
html = etree.HTML(text)
html_data = html.xpath('//li/a/text()')
print(html_data)
- 查找一下l相对路径下li标签下的a标签下的href属性的值,注意,a标签后面需要双//
html = etree.HTML(text)
html_data = html.xpath('//li/a//@href')
print(html_data)
- 查找a标签下属性href值为https://s4.bdstatic.com/的内容
html = etree.HTML(text)
html_data = html.xpath('//li/a[@href="https://s4.bdstatic.com/"]/text()')
print(html_data)
- 1
- 2
- 3
5.4 子节点
通过 / 或 // 即可查找元素的子节点或子孙节点。
选择 li 节点的所有直接 a 子节点xpath为://li/a
5.5 父节点
知道子节点,查询父节点可以用 … 来实现:
查找a节点属性为https://s6.bdstatic.com/的父节点class的属性xpath为: //a[@href="https://s6.bdstatic.com/"]/../@class
html_data = html.xpath('//a[@href="https://s6.bdstatic.com/"]/../@class')
print(html_data)
#输出为:['item-5']
- 1
- 2
- 3
- 4
5.6 属性匹配
匹配时可以用@符号进行属性过滤
例如匹配li下属性class为item-5的内容
//li[@class="item-5"]
- 1
5.7 文本获取
有两种方法:一是获取文本所在节点后直接获取文本,二是使用 //。
第二种方法会获取到补全代码时换行产生的特殊字符,推荐使用第一种方法,可以保证获取的结果是整洁的。
# 第一种
from lxml import etree
html_data = html.xpath('//li[@class="item-1"]/a/text()')
print(html_data)
# 第二种
html_data = html.xpath('//li[@class="item-1"]//text()')
print(html_data)
5.8 属性获取
@符号相当于过滤器,可以直接获取节点的属性值
result = html.xpath('//li/a/@href')
print(result)
# 运行结果:['https://s1.bdstatic.com/', 'https://s2.bdstatic.com/', 'https://s3.bdstatic.com/', 'https://s4.bdstatic.com/', 'https://s5.bdstatic.com/', 'https://s6.bdstatic.com/']
- 1
- 2
- 3
5.9 属性多值匹配
某些节点的某个属性可能有多个值:
from lxml import etree
text = '''
<li class="zxc asd wer"><a href="https://s2.bdstatic.com/">1 item</a></li>
<li class="ddd asd eee"><a href="https://s3.bdstatic.com/">2 item</a></li>
'''
html = etree.HTML(text)
result = html.xpath('//li[contains(@class, "asd")]/a/text()')
print(result)
# 运行结果:['1 item', '2 item']
- 5.10 多属性匹配
当前节点有多个属性时,需要同时进行匹配:
from lxml import etree
text = '''
<li class="zxc asd wer" name="222"><a href="https://s2.bdstatic.com/">1 item</a></li>
<li class="ddd zxc eee" name="111"><a href="https://s3.bdstatic.com/">2 item</a></li>
'''
html = etree.HTML(text)
result = html.xpath('//li[contains(@class, "zxc") and @name="111"]/a/text()')
print(result)
# 运行结果:['2 item']
5.11 函数
- 查找最后一个li标签里的a标签的href属性(last()函数)
html = etree.HTML(text)
html_data = html.xpath('//li[last()]/a/text()')
print(html_data)
- 1
- 2
- 3
- 查找倒数第二个li标签里的a标签的href属性
html_data = html.xpath('//li[last()-1]/a/text()')
print(html_data)
打印
['item 4 ']
from lxml import etree
print("------------")
text = '''
<div>
<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>
</div>
'''
html = etree.HTML(text)
# 获取第一个
result = html.xpath('//li[1]/a/text()')
print(result)
# 获取最后一个
result = html.xpath('//li[last()]/a/text()')
print(result)
# 获取前两个
result = html.xpath('//li[position()<3]/a/text()')
print(result)
# 获取倒数第三个
result = html.xpath('//li[last()-2]/a/text()')
print(result)
"""
运行结果:
['item 0 ']
['item 5 ']
['item 0 ', 'item 1 ']
['item 3 ']
"""
6. 项目实战
Python3爬虫学习-妹子网爬取MM图片批量下载 (详细介绍)。
7. XPATH参考文档:
XPath 中函数文档参考:http://www.w3school.com.cn/xpath/xpath_functions.asp
轴的用法:http://www.w3school.com.cn/xpath/xpath_axes.asp
XPath 的用法:http://www.w3school.com.cn/xpath/index.asp
Python lxml 的用法:http://lxml.de
官方文档:https://www.w3.org/TR/xpath/
学习资料见知识星球。
以上就是今天要分享的技巧,你学会了吗?若有什么问题,欢迎在下方留言。
快来试试吧,小琥 my21ke007。获取 1000个免费 Excel模板福利!
更多技巧, www.excelbook.cn
欢迎 加入 零售创新 知识星球,知识星球主要以数据分析、报告分享、数据工具讨论为主;
1、价值上万元的专业的PPT报告模板。
2、专业案例分析和解读笔记。
3、实用的Excel、Word、PPT技巧。
4、VIP讨论群,共享资源。
5、优惠的会员商品。
6、一次付费只需99元,即可下载本站文章涉及的文件和软件。
共有 0 条评论