python网络爬虫精解之XPath的使用说明

目录
  • 一、XPath的介绍
  • 二、XPath使用
    • 1、选取所有节点
    • 2、获取子节点
    • 3、获取父节点
    • 4、属性匹配
    • 5、文本获取
    • 6、属性获取
    • 7、属性多值匹配
    • 8、多属性匹配
    • 9、按序选择
    • 10、节点轴选择

XPath的使用

一、XPath的介绍

XPath的几个常用规则:

表达式 描述
nodename 选取此节点的所有子节点
/ 从当前节点选取直接子节点
// 从当前节点选取子孙节点
. 选取当前节点
选取当前节点的父节点
@ 选取属性

二、XPath使用

1、选取所有节点

test01.html

<book class="item">
  <title lang="en" class="item-01">Harry Potter</title>
  <author class="item-02 name">J K. Rowling</author>
  <year>2005</year>
  <price>29.99</price>
</book>
from lxml import etree

html = etree.parse('./test01.html',etree.HTMLParser())
result = html.xpath('//*')
print(result)

运行程序后得到一个列表:

[<Element html at 0x2252aff0d88>, <Element body at 0x2252aff0e48>, <Element book at 0x2252aff0e88>, <Element title at 0x2252aff0ec8>, <Element author at 0x2252aff0f08>, <Element year at 0x2252aff0f88>, <Element price at 0x2252aff0fc8>]

列表中每个元素代表原test01.html文件中的节点,可以看出节点有html、body、book、title、author、year、price节点。

2、获取子节点

如果想要获取book节点下的author节点,则可将代码编写为:

from lxml import etree

html = etree.parse('./test01.html',etree.HTMLParser())
result = html.xpath('//author')
print(result)

这样仅可获得author节点:[<Element author at 0x2252aef8748>]

3、获取父节点

获取当前节点的父节点,主要是父节点的属性值。

以获取父节点book的class属性值为例。

from lxml import etree
html = etree.parse('./test01.html',etree.HTMLParser())
result = html.xpath('//title[@class="item-01"]/../@class') #获取title节点的父节点的class属性值
print(result)

【运行结果】

['item']

通过查阅之前test01.html的源码可知,父节点book的class属性值为“item”。

4、属性匹配

我们知道每个节点几乎都带有属性,通过属性匹配我们可以匹配具有相同节点名但属性不同的节点。

通常是将需要匹配的属性放在中括号内。

例如,用属性匹配的方式获取title节点。

from lxml import etree
html = etree.parse('./test01.html',etree.HTMLParser())
result = html.xpath('//title[@lang="en"]')
print(result)

【运行结果】

[<Element title at 0x2252afb2a48>]

则得到了title节点。

5、文本获取

一般我们爬取的内容都是文本形式,我们使用text()方式将文本内容提取出来。

在上一个实例的基础上,我们获取标题的具体内容。

from lxml import etree
html = etree.parse('./test01.html',etree.HTMLParser())
result = html.xpath('//title[@lang="en"]/text()')
print(result)

【运行结果】

['Harry Potter']

这样我们就得到了具体的标题名称。

6、属性获取

有时候我们想要的数据不在文本内容,而是在节点的属性值里,因此我们还需要学会获取节点的属性值。

常用方式是在需要获取的属性值前面加@符号即可。

例如,我们获取标题title的lang和class这两个属性值。

from lxml import etree
html = etree.parse('./test01.html',etree.HTMLParser())
result = html.xpath('//title/@lang')
result.append(html.xpath('//title/@class')[0])
print(result)

【运行结果】

['en', 'item-01']

这样我们就完成了属性值的获取。

7、属性多值匹配

有时候属性值并不只有一个,而是具有多个属性值,像实例中author节点的class属性值,具有两个值item-02和name,通常我们在匹配时使用contains()方法,该方法的第一个参数传入属性名称,第二个参数传入属性值(多个属性值中的任意一个)。

我们以获取作者姓名为例:

from lxml import etree
html = etree.parse('./test01.html',etree.HTMLParser())
result = html.xpath('//author[contains(@class,name)]/text()')
print(result)

【运行结果】

['J K. Rowling']

8、多属性匹配

一个节点通常会有多个属性,例如实例中的title节点,就具有lang和class节点,在进行多属性匹配时,使用and符来连接。

from lxml import etree
html = etree.parse('./test01.html',etree.HTMLParser())
result = html.xpath('//title[@lang="en" and @class="item-01"]/text()')
print(result)

【运行结果】

['Harry Potter']

以下是常见的运算符:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GyHoIIVB-1631169770821)(D:\Users\31156\Desktop\网络爬虫\img\img11.jpg)]

9、按序选择

实例test02.html

<bookstore>
<book>
  <title lang="eng">Harry Potter</title>
  <price>29.99</price>
</book>
<book>
  <title lang="eng">Learning XML</title>
  <price>39.95</price>
</book>
</bookstore>

我们还是按照之前讲的,获取book节点下的title名。

from lxml import etree
html = etree.parse('./test02.html',etree.HTMLParser())
result = html.xpath('//book/title/text()')
print(result)

【运行结果】

['Harry Potter', 'Learning XML']

这时我们看到有两个标题名,在处理时,我们可以在中括号中传入索引获取指定次序的节点。

获取依次节点的值:

from lxml import etree
html = etree.parse('./test02.html',etree.HTMLParser())
result1 = html.xpath('//book[1]/title/text()')
result2 = html.xpath('//book[2]/title/text()')
print(result1)
print(result2)

【运行结果】

['Harry Potter']
['Learning XML']

还有一些其他方法,例如获取最后一个节点用last()等,其他操作函数可参考:XPath函数

10、节点轴选择

这些节点轴可以帮助我们更快速的进行匹配。

到此这篇关于python网络爬虫精解之XPath的使用说明的文章就介绍到这了,更多相关python XPath内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • python网络爬虫精解之pyquery的使用说明

    目录 一.pyquery的介绍 二.pyquery的使用 1.初始化工作 字符串 URL 文件初始化 2.查找节点 (1)查找子节点 (2)匹配父节点 (3)匹配兄弟节点 3.遍历 4.获取信息 (1)获取属性 (2)获取文本 5.节点操作 (1)为某个节点添加或删除一个class (2)attr.text.html (3)remove 6.伪类选择器 pyquery的使用 一.pyquery的介绍 使用pyquery需要在Web和了解jQuery的基础上,使用该CSS选择器. 二.pyquer

  • python网络爬虫实战

    目录 一.概述 二.原理 三.爬虫分类 1.传统爬虫 2.聚焦爬虫 3.通用网络爬虫(全网爬虫) 四.网页抓取策略 1.宽度优先搜索: 2.深度优先搜索: 3.最佳优先搜索: 4.反向链接数策略: 5.Partial PageRank策略: 五.网页抓取的方法 1.分布式爬虫 现在比较流行的分布式爬虫: 2.Java爬虫 3.非Java爬虫 六.项目实战 1.抓取指定网页 抓取某网首页 2.抓取包含关键词网页 3.下载贴吧中图片 4.股票数据抓取 六.结语 一.概述 网络爬虫(Web crawl

  • python网络爬虫之模拟登录 自动获取cookie值 验证码识别的具体实现

    目录 1.爬取网页分析 2.验证码识别 3.cookie自动获取 4.程序源代码 chaojiying.py sign in.py 1.爬取网页分析 爬取的目标网址为:https://www.gushiwen.cn/ 在登陆界面需要做的工作有,获取验证码图片,并识别该验证码,才能实现登录. 使用浏览器抓包工具可以看到,登陆界面请求头包括cookie和user-agent,故在发送请求时需要这两个数据.其中user-agent可通过手动添加到请求头中,而cookie值需要自动获取. 分析完毕,实践

  • 详解如何用Python模拟登录淘宝

    目录 一.淘宝登录流程 二.模拟登录实现 1.判断是否需要验证码 2.验证用户名密码 3.申请st码 4.使用st码登录 5.获取淘宝昵称 三.总结 1.代码结构 2.存在问题 看了下网上有很多关于模拟登录淘宝,但是基本都是使用scrapy.pyppeteer.selenium等库来模拟登录,但是目前我们还没有讲到这些库,只讲了requests库,那我们今天就来使用requests库模拟登录淘宝! 讲模拟登录淘宝之前,我们来回顾一下之前用requests库模拟登录豆瓣和新浪微博的过程:这一类模拟

  • python网络爬虫精解之XPath的使用说明

    目录 一.XPath的介绍 二.XPath使用 1.选取所有节点 2.获取子节点 3.获取父节点 4.属性匹配 5.文本获取 6.属性获取 7.属性多值匹配 8.多属性匹配 9.按序选择 10.节点轴选择 XPath的使用 一.XPath的介绍 XPath的几个常用规则: 表达式 描述 nodename 选取此节点的所有子节点 / 从当前节点选取直接子节点 // 从当前节点选取子孙节点 . 选取当前节点 - 选取当前节点的父节点 @ 选取属性 二.XPath使用 1.选取所有节点 test01.

  • python网络爬虫精解之正则表达式的使用说明

    目录 一.常见的匹配规则 二.常见的匹配方法 1.match() 2.search() 3.findall() 4.sub() 5.compile() 一.常见的匹配规则 二.常见的匹配方法 1.match() match()方法从字符串的起始位置开始匹配,该方法有两个参数,第一个是正则表达式,第二个是需要匹配的字符串: re.match(正则表达式,字符串) 如果该方法匹配成功,返回的是SRE_Match对象,如果未匹配到,则返回None. 返回成功后有两个方法,group()方法用来查看匹配

  • python网络爬虫精解之Beautiful Soup的使用说明

    目录 一.Beautiful Soup的介绍 二.Beautiful Soup的使用 1.节点选择器 2.提取信息 3.关联选择 4.方法选择器 5.CSS选择器 一.Beautiful Soup的介绍 Beautiful Soup是一个强大的解析工具,它借助网页结构和属性等特性来解析网页. 它提供一些函数来处理导航.搜索.修改分析树等功能,Beautiful Soup不需要考虑文档的编码格式.Beautiful Soup在解析时实际上需要依赖解析器,常用的解析器是lxml. 二.Beautif

  • 详解如何使用Python网络爬虫获取招聘信息

    目录 前言 项目目标 项目准备 反爬措施 项目实现 效果展示 小结 前言 现在在疫情阶段,想找一份不错的工作变得更为困难,很多人会选择去网上看招聘信息.可是招聘信息有一些是错综复杂的.而且不能把全部的信息全部罗列出来,以外卖的58招聘网站来看,资料整理的不清晰. 项目目标 获取招聘信息,并批量把地点. 公司名.工资 .下载保存在txt文档. 项目准备 软件:PyCharm 需要的库:requests.lxml.fake_useragent 网站如下: https://gz.58.com/job/

  • Python网络爬虫中的同步与异步示例详解

    一.同步与异步 #同步编程(同一时间只能做一件事,做完了才能做下一件事情) <-a_url-><-b_url-><-c_url-> #异步编程 (可以近似的理解成同一时间有多个事情在做,但有先后) <-a_url-> <-b_url-> <-c_url-> <-d_url-> <-e_url-> <-f_url-> <-g_url-> <-h_url-> <--i_ur

  • 详解Python网络爬虫功能的基本写法

    网络爬虫,即Web Spider,是一个很形象的名字.把互联网比喻成一个蜘蛛网,那么Spider就是在网上爬来爬去的蜘蛛. 1. 网络爬虫的定义 网络蜘蛛是通过网页的链接地址来寻找网页的.从网站某一个页面(通常是首页)开始,读取网页的内容,找到在网页中的其它链接地址,然后通过这些链接地址寻找下一个网页,这样一直循环下去,直到把这个网站所有的网页都抓取完为止.如果把整个互联网当成一个网站,那么网络蜘蛛就可以用这个原理把互联网上所有的网页都抓取下来.这样看来,网络爬虫就是一个爬行程序,一个抓取网页的

  • python网络爬虫学习笔记(1)

    本文实例为大家分享了python网络爬虫的笔记,供大家参考,具体内容如下 (一)   三种网页抓取方法 1. 正则表达式: 模块使用C语言编写,速度快,但是很脆弱,可能网页更新后就不能用了. 2.Beautiful Soup 模块使用Python编写,速度慢. 安装: pip install beautifulsoup4 3. Lxml 模块使用C语言编写,即快速又健壮,通常应该是最好的选择. (二) Lxml安装 pip install lxml 如果使用lxml的css选择器,还要安装下面的

  • Python网络爬虫之爬取微博热搜

    微博热搜的爬取较为简单,我只是用了lxml和requests两个库 url= https://s.weibo.com/top/summary?Refer=top_hot&topnav=1&wvr=6 1.分析网页的源代码:右键--查看网页源代码. 从网页代码中可以获取到信息 (1)热搜的名字都在<td class="td-02">的子节点<a>里 (2)热搜的排名都在<td class=td-01 ranktop>的里(注意置顶微博是

  • python网络爬虫实现发送短信验证码的方法

    前言:今天要总结的是如何用程序来实现短信发送功能.但是呢,可能需要我们调用一些api接口,我会详细介绍.都是自己学到的,害怕忘记,所以要总结一下,让写博客成为一种坚持的信仰.废话不多说,我们开始吧! 网络爬虫实现发送短信验证码 在实现我们目标的功能之前,我们要有自己的思路,否则你没有方向,又如何实现自己的代码功能呢? 我们要发送短信,那么我们其实是需要分析的.我们可以去分析一个可以发送短信的网站页面. 我们来到这里如下: 可以看到这是一个注册界面,我们在注册时会被要求需要填写手机号码的·,其实还

随机推荐