Python网络爬虫四大选择器用法原理总结


Posted in Python onJune 01, 2020

前几天小编连续写了四篇关于Python选择器的文章,分别用正则表达式、BeautifulSoup、Xpath、CSS选择器分别抓取京东网的商品信息。今天小编来给大家总结一下这四个选择器,让大家更加深刻的理解和熟悉Python选择器。

一、正则表达式

正则表达式为我们提供了抓取数据的快捷方式。虽然该正则表达式更容易适应未来变化,但又存在难以构造、可读性差的问题。当在爬京东网的时候,正则表达式如下图所示:

Python网络爬虫四大选择器用法原理总结

利用正则表达式实现对目标信息的精准采集

此外 ,我们都知道,网页时常会产生变更,导致网页中会发生一些微小的布局变化时,此时也会使得之前写好的正则表达式无法满足需求,而且还不太好调试。当需要匹配的内容有很多的时候,使用正则表达式提取目标信息会导致程序运行的速度减慢,需要消耗更多内存。

二、BeautifulSoup

BeautifulSoup是一个非常流行的 Pyhon 模块。该模块可以解析网页,并提供定位内容的便捷接口。通过'pip install beautifulsoup4'就可以实现该模块的安装了。

Python网络爬虫四大选择器用法原理总结

利用美丽的汤去提取目标信息

使用 BeautifulSoup的第一步是将己下载的 HTML 内容解析为 soup文档。由 于大多 数网 页都不具备良好的HTML 格式,因此BeautifulSoup需要对实际格式进行确定。BeautifulSoup能够正确解析缺失的引号并闭合标签,此外还会添加<html >和<body>标签使其成为完整的HTML文档。通常使用find() 和find_all()方法来定位我们需要的元素。如果你想了解BeautifulSoup全部方法和参数,可以查阅BeautifulSoup的官方文档。虽然BeautifulSoup在代码的理解上比正则表达式要复杂一些,但是其更加容易构造和理解。

三、Lxml

Lxml模块使用 C语言编写,其解析速度比 BeautiflSoup更快,而且其安装过程也更为复杂,在此小编就不赘述啦。XPath 使用路径表达式在 XML 文档中选取节点。节点是通过沿着路径或者 step 来选取的。

Python网络爬虫四大选择器用法原理总结

Xpath

使用 lxml 模块的第一步和BeautifulSoup一样,也是将有可能不合法的HTML 解析为 统一格式。 虽然Lxml可以正确解析属性两侧缺失的引号,并闭合标签,不过该模块没有额外添加<html >和<body>标签 。

在线复制Xpath表达式可以很方便的复制Xpath表达式。但是通过该方法得到的Xpath表达式放在程序中一般不能用,而且长的没法看。所以Xpath表达式一般还是要自己亲自上手。

四、CSS

CSS选择器表示选择元素所使用 的模式。BeautifulSoup整合了CSS选择器的语法和自身方便使用API。在网络爬虫的开发过程中,对于熟悉CSS选择器语法的人,使用CSS选择器是个非常方便的方法。

Python网络爬虫四大选择器用法原理总结

CSS选择器

下面是一些常用的选择器示例。

  • 选择所有标签: *
  • 选择<a>标 签: a
  • 选择所有class=”link” 的元素: .l in k
  • 选择 class=”link” 的<a>标签: a.link
  • 选择 id= " home ” 的<a>标签: a Jhome
  • 选择父元素为<a>标签的所有< span>子标签: a > span
  • 选择<a>标签内部的所有<span>标签: a span
  • 选择title属性为” Home ” 的所有<a>标签: a [title=Home]

五、性能对比

lxml 和正则表达式模块都是C语言编写的,而BeautifulSoup则是纯Python 编写的。下表总结了每种抓取方法的优缺点。

Python网络爬虫四大选择器用法原理总结

相对困难需要注意的是。lxml在内部实现中,实际上是将CSS选择器转换为等价的Xpath选择器。

六、总结

如果你的爬虫瓶颈是下载网页,而不是抽取数据的话,那么使用较慢的方法(如BeautifulSoup) 也不成问题。如果只需抓取少量数据,并且想要避免额外依赖的话,那么正则表达式可能更加适合。不过,通常情况下,l xml是抓取数据的最好选择,这是因为该方法既快速又健壮,而正则表达式和BeautifulSoup只在某些特定场景下有用。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python中list常用操作实例详解
Jun 03 Python
python的re正则表达式实例代码
Jan 24 Python
Python并发之多进程的方法实例代码
Aug 15 Python
使用django-guardian实现django-admin的行级权限控制的方法
Oct 30 Python
python读写csv文件实例代码
Jul 05 Python
Win10+GPU版Pytorch1.1安装的安装步骤
Sep 27 Python
python GUI库图形界面开发之PyQt5中QMainWindow, QWidget以及QDialog的区别和选择
Feb 26 Python
在Mac中配置Python虚拟环境过程解析
Jun 22 Python
Python如何实现远程方法调用
Aug 07 Python
Python批量修改xml的坐标值全部转为整数的实例代码
Nov 26 Python
如何利用Python实现n*n螺旋矩阵
Jan 18 Python
使用Python通过企业微信应用给企业成员发消息
Apr 18 Python
浅谈Pycharm的项目文件名是红色的原因及解决方式
Jun 01 #Python
pycharm设置默认的UTF-8编码模式的方法详解
Jun 01 #Python
解决pycharm导入本地py文件时,模块下方出现红色波浪线的问题
Jun 01 #Python
Python常见反爬虫机制解决方案
Jun 01 #Python
解决python运行启动报错问题
Jun 01 #Python
利用python控制Autocad:pyautocad方式
Jun 01 #Python
Python 跨.py文件调用自定义函数说明
Jun 01 #Python
You might like
php实现文件下载功能的几个代码分享
2014/05/10 PHP
ThinkPHP采用GET方式获取中文参数查询无结果的解决方法
2014/06/26 PHP
PHP的引用详解
2015/02/22 PHP
去除链接虚线全面分析总结
2006/08/15 Javascript
javaScript 读取和设置文档元素的样式属性
2009/04/14 Javascript
javascript CSS画图之基础篇
2009/07/29 Javascript
js实现GridView单选效果自动设置交替行、选中行、鼠标移动行背景色
2010/05/27 Javascript
Jquery中getJSON在asp.net中的使用说明
2011/03/10 Javascript
javascript利用控件对windows的操作实现原理与应用
2012/12/23 Javascript
javascript中闭包(Closure)详解
2016/01/06 Javascript
JQuery插件Marquee.js实现无缝滚动效果
2016/04/26 Javascript
Angular下H5上传图片的方法(可多张上传)
2017/01/09 Javascript
老生常谈jquery id选择器和class选择器的区别
2017/02/12 Javascript
javascript回调函数详解
2018/02/06 Javascript
vue + vuex todolist的实现示例代码
2018/03/09 Javascript
通过 JS 判断页面是否有滚动条的实现方法
2018/04/05 Javascript
[02:28]DOTA2亚洲邀请赛附加赛 RECAP赛事回顾
2015/01/29 DOTA
深入理解python函数递归和生成器
2016/06/06 Python
关于反爬虫的一些简单总结
2017/12/13 Python
修改默认的pip版本为对应python2.7的方法
2018/11/06 Python
Python实现直播推流效果
2019/11/26 Python
瑞典度假品牌:OAS
2019/05/28 全球购物
Linux上比较文件的命令都有哪些
2012/02/24 面试题
个人求职简历中英文自我评价
2013/12/16 职场文书
计算机专业职业生涯规划范文
2014/01/19 职场文书
国贸专业的职业规划范文
2014/01/23 职场文书
医药个人求职信范文
2014/01/29 职场文书
个人三严三实对照检查材料
2014/09/25 职场文书
2014年销售部工作总结
2014/12/01 职场文书
2014年小学数学教师工作总结
2014/12/03 职场文书
培训督导岗位职责
2015/04/10 职场文书
2015年安全保卫工作总结
2015/05/14 职场文书
员工聘用合同范本
2015/09/21 职场文书
小数乘法教学反思
2016/02/22 职场文书
2016年社区“我们的节日·中秋节”活动总结
2016/04/05 职场文书
教你利用Nginx 服务搭建子域环境提升二维地图加载性能的步骤
2021/09/25 Servers