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 常用规则

20200303100359591
具体匹配后面会详细的讲解。

4. 安装

1、python3环境下安装命令:pip install lxml
20200303100644938
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)

输出为:
20200303102921525

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

20200303103601991

  • 打印指定路径下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

20200303104257165

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

20200303104705488

5.3 相对路径查找(常用)

  • 查找所有li标签下的a标签内容
html = etree.HTML(text)
html_data = html.xpath('//li/a/text()')
print(html_data)

2020030310491784

  • 查找一下l相对路径下li标签下的a标签下的href属性的值,注意,a标签后面需要双//
html = etree.HTML(text)
html_data = html.xpath('//li/a//@href')
print(html_data)

20200303105146151

  • 查找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

20200303105454707

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

20200303105706140

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

欢迎 加入 零售创新 知识星球,知识星球主要以数据分析、报告分享、数据工具讨论为主;

电商数据分析360°实战攻略!

你将获得:

1、价值上万元的专业的PPT报告模板。

2、专业案例分析和解读笔记。

3、实用的Excel、Word、PPT技巧。

4、VIP讨论群,共享资源。

5、优惠的会员商品。

6、一次付费只需99元,即可下载本站文章涉及的文件和软件。

文章版权声明 1、本网站名称:Excelbook
2、本站永久网址:http://www.excelbook.cn
3、本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长王小琥进行删除处理。
4、本站一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
5、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报。
6、本站资源大多存储在云盘,如发现链接失效,请联系我们我们会第一时间更新。

THE END
分享
二维码
< <上一篇
下一篇>>