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'))

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)

在这里插入图片描述

  • 打印指定路径下a标签的属性
    这里可以通过遍历拿到某个属性的值,查找标签的内容,通过@属性名获取
html = etree.HTML(text)
html_data = html.xpath('/html/body/ul/li/a/@href')
for i in html_data:
    print(i)

在这里插入图片描述

  • 获取指定标签对应属性值的内容
    使用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)

在这里插入图片描述

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)

在这里插入图片描述

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']

5.6 属性匹配

匹配时可以用@符号进行属性过滤

例如匹配li下属性class为item-5的内容

//li[@class="item-5"]

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/']

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)

在这里插入图片描述

  • 查找倒数第二个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/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章