Python爬虫必备技能,Xpath提取数据规格详解
python爬虫:XPath语法和使用示例
XPath(XML Path Language)是一门在XML文档中查找信息的语言,可以用来在XML文档中对元素和属性进行遍历。
很多人学习python,不知道从何学起。
很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手。
很多已经做案例的人,却不知道如何去学习更加高深的知识。
那么针对这三类人,我给大家提供一个好的学习平台,免费领取视频教程,电子书籍,以及课程的源代码!
QQ群:101677771
选取节点
XPath使用路径表达式来选取XML文档中的节点或者节点集。这些路径表达式和我们在常规的电脑文件系统中看到的表达式非常相似。
常用路径表达式:
表达式 | 描述 |
---|---|
nodename | 选取此节点的所有子节点。 |
/ | 从根节点选取。 |
// | 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。 |
. | 选取当前节点。 |
.. | 选取当前父节点。 |
@ | 选取属性。 |
text() | 选取文本内容。 |
实例
在下面的表格中,列出一些路径表达式以及表达式的结果:
路径表达式 | 结果 |
---|---|
bookstore | 选取bookstore元素 |
/bookstore | 选取根元素bookstore。注释:假如路径起始于(/),则此路径始终代表到某元素的绝对路径。 |
bookstore/book | 选取属于bookstore的子元素的所有book元素。 |
//book | 选取所有book子元素,而不管他们在文档中的位置。 |
bookstore//book | 选择属于bookstore元素的后代的所有book元素,而不管它们位于bookstore之下的什么位置。 |
//book/title/@lang | 选择所有的book下面的title中的lang属性的值。 |
//book/title/text() | 选择所有的book下面的title的文本。 |
查找特定的节点
路径表达式 | 结果 |
---|---|
//title[@lang] | 选取所有拥有名为lang的属性的title元素。 |
//title[@lang="eng"] | 选取lang属性值为eng的所有title元素。 |
/bookstore/book[1] | 选取属于bookstore子元素的第一个book元素。 |
/bookstore/book[last()] | 选取属于bookstore子元素的最后一个book元素。 |
/bookstore/book[position()>1] | 选择bookstore下面的book元素,从第二个开始选择。 |
//book/title[text()='Harry Potter'] | 选择所有book下的title元素,仅仅选择文本为Harry Potter的title元素。 |
/bookstore/book[price>35.00]/title | 选取bookstore元素中的book元素的所有title元素,且其中的price元素的值需大于35.00。 |
注意点:在xpath中,第一个元素的位置是1,最后一个元素的位置是last(),倒数第二个是last()-1。
选取未知节点
XPath通配符可用来选取未知的XML元素。
通配符 | 描述 |
---|---|
* | 匹配任何元素节点。 |
@* | 匹配任何属性的节点。 |
node() | 匹配任何类型的节点。 |
实例
在下面的表格中,列出一些路径表达式以及表达式的结果:
路径表达式 | 结果 |
---|---|
//bookstore/* | 选取bookstore元素的所有子元素。 |
//* | 选取文档中的所有元素。 |
//title[@*] | 选取所有带属性的title元素。 |
选取若干路径
通过在路径表达式中使用"|"运算符,您可以选取若干个路径。
实例
在下面的表格中,列出一些路径表达式以及表达式的结果:
路径表达式 | 结果 |
---|---|
//book/title | //book/price | 选取book元素的所有title和price元素。 |
//title | //price | 选取文档中的所有title和price元素。 |
/bookstore/book/title | //price | 选取属于bookstore元素的book元素的所有title元素,以及文档中所有的price元素。 |
使用技巧
在一般的爬虫实战中,XPath路径可以通过谷歌浏览器或火狐浏览器中复制得到,如下图:
但是对于新手可以多多尝试自己写XPath路径,因为有时候复制获取的XPath路径过长,而自己写的更简洁写。
例子:
import requests from lxml import etreeheaders = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36' } url = 'http://www.qiushibaike.com/text/' res = requests.get(url, headers=headers) selector = etree.HTML(res.text) id = selector.xpath('//div[@class="article block untagged mb15 typs_long"]/div[1]/a[2]/h2/text()') print(''.join(id).strip())# 注意:通过/text()可以获取标签中的文字信息。 # 结果为:璃白°
几种解析方式的性能对比
爬取方法 | 性能 | 使用难度 |
---|---|---|
正则表达式 | 快 | 困难 |
BeautifulSoup | 慢 | 简单 |
Lxml | 快 | 简单 |
爬取豆瓣图书TOP250
爬取的例子直接输出到屏幕。
需求分析:
(1)要爬取的内容为豆瓣图书top250的信息,如下图所示:
(2)所爬取的网页链接: https://book.douban.com/top250?start=0
(3)需要爬取的信息有:书名,书本的链接,作者,出版社,出版日期评分和评价。
具体代码如下:
# -*- encoding:utf8 -*- # 爬取豆瓣图书TOP250。 import requests from lxml import etree# 请求头,用来模拟浏览器 headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36' }def get_info(url):res = requests.get(url, headers=headers).text# lxml库的etree解析htmlselector = etree.HTML(res)# 获取的是一页中所有的书本信息,每本的所以信息都在类为item的tr下面。infos = selector.xpath("//tr[@class='item']")for info in infos:# 书名name = info.xpath('td/div/a/@title')[0]# 书的链接地址book_url = info.xpath('td/div/a/@href')[0]# 获取的是书本的基本信息,有作者和出版社,和出版日期...book_infos = info.xpath('td/p/text()')[0]# 作者author = book_infos.split('/')[0]# 出版社publisher = book_infos.split('/')[-3]# 出版日期date = book_infos.split('/')[-2]# 价格price = book_infos.split('/')[-1]# 书本的评分rate = info.xpath('td/div/span[2]/text()')[0]# 下面的评论comments = info.xpath('td/p/span/text()')# 这里单行的if语句是:如果comments的长度不为0时,则把comments的第1个元素给comment,否则就把"空"赋值给commentcomment = comments[0] if len(comments) != 0 else "空"print(name + " " + book_url + " " + book_infos + " " + author + " " + publisher + " " + date + " " + price + " " + rate + " " + comment)print()# 获取下一页的urlif selector.xpath("//span[@class='next']/a"):next_pag = selector.xpath("//span[@class='next']/a/@href")get_info(''.join(next_pag))if __name__ == "__main__":url = 'https://book.douban.com/top250'get_info(url)
部分结果如下图所示:
Python爬虫必备技能,Xpath提取数据规格详解相关推荐
- Python爬虫包 BeautifulSoup 递归抓取实例详解
Python爬虫包 BeautifulSoup 递归抓取实例详解 概要: 爬虫的主要目的就是为了沿着网络抓取需要的内容.它们的本质是一种递归的过程.它们首先需要获得网页的内容,然后分析页面内容并找到另 ...
- Python爬虫之爬取淘女郎照片示例详解
更多编程教程请到:菜鸟教程 https://www.piaodoo.com/ 友情链接: 高州阳光论坛https://www.hnthzk.com/ 人人影视http://www.op-kg.com/ ...
- 爬虫必备技能xpath的用法和实战
环境配置 1.本文使用的python版本是python3 2.使用到的依赖包如下: requests scrapy 在安装 scrapy 之前需要先安装 Twisted(点击下载) 下载符合自己版本的 ...
- python爬虫之Scrapy框架原理及操作实例详解、股票数据Scrapy爬虫
爬虫框架 -scrapy.pyspider.crawley等 Scrapy框架 1.scrapy框架介绍 -https://doc.scrapy.org/en/latest/ -http://scra ...
- python爬虫4:json提取数据
JSON JSON(JavaScript Object Notation, JS对象简谱)是一种轻量级的数据交换格式.它基于 ECMAScript(European Computer Manufact ...
- Python爬虫之破解百度翻译--requests案例详解(一)
们通过requests模块讲了简单的网页采集方法,这一节课我们讲一下怎么用requests模块破解百度翻译.其中包含的知识点有post请求.Jason.异步加载等内容.这节课由于信息量比较大,所以分两 ...
- python中字典是几维数据_详解Python字典数据类型
字典的定义 dictionary(字典)是除列表以外 Python之中最灵活的数据类型. 字典同样可以用来存储多个数据,通常用于存储描述一个物体的相关信息. 和列表的区别:列表是有序的对象集合,字典是 ...
- Python爬虫之破解百度翻译--requests案例详解(二)
这节课我们接着上节课的内容,继续学习requests之破解百度翻译案例.我们上节课已经知道了解题思路,这节课我们来看看代码怎么写. 1.首先导入requests模块 ** ** ** ** 2.获取请 ...
- Python爬虫:模拟登录知乎完全详解
[源码在最下面] 知乎登录分为邮箱登录和手机登录两种方式,通过浏览器的开发者工具查看,我们通过不同方式登录时,网址是不一样的.邮箱登录的地址email_url = 'https://www.zhihu ...
最新文章
- 将Eclipse中Web项目打成war包
- 合并文件夹中子目录_01 Linux之统计文件夹中文件个数以及目录个数
- cloud一分钟 | 腾讯云联手斗鱼、虎牙两大头部游戏直播平台开启 定制道具的创新互动...
- java 64内存不足_请教一个 Java 内存占用的问题
- Android 基本开发规范(必读)
- 利用Python Matplotlib库做简单的视觉化
- 【caffe】Caffe的Python接口-官方教程-01-learning-Lenet-详细说明(含代码)
- 人群疏散matlab程序,人群疏散方法及系统与流程
- 学习笔记 | Inverting Gradients--How easy is it to break privacy in federated learning
- windows 下配置nginx访问静态图片
- 怎么提供电子邮件副本_停止提供您的电话号码和电子邮件
- c语言用中括号括起来的变量,用大括号将寄存器名括起来是什么意思?
- 模式识别——0.绪论
- thinkphp构架
- HTTP Header 详解,headers的值都是什么意思
- asp程序的mdb数据库转mysql教程(少走弯路)思路
- 4 数字加密 (15分)——一维数组
- 『STC8H8K64U』概述
- 武汉大学计算机学院推荐免试,武汉大学计算机学院2013年应届本科毕业生推荐免试研究生计分细则...
- 彩灯循环控制器的设计与制作
热门文章
- 微积分学习笔记五:多元函数微积分
- (7)Microsoft office Word 2013版本操作入门_常用技巧
- 修复SVCHOST.EXE出现0x745f2780错误
- 切换用户访问共享文件夹
- ASP.NET MVC 4 视图页去哪里儿
- linux下安装php两种模式区别
- 【WPF】如何保存RichTextBox的文本到数据库?以及如何对RichTextBox的Document做绑定?...
- 为什么选择 npm script?
- Docker部署自己的短链接服务
- Oracle数据库表中字段顺序的修改方法