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的Django框架测试驱动开发的教程
Apr 22 Python
Python实现压缩和解压缩ZIP文件的方法分析
Sep 28 Python
基于Python 装饰器装饰类中的方法实例
Apr 21 Python
关于Python的一些学习总结
May 25 Python
Python实现的json文件读取及中文乱码显示问题解决方法
Aug 06 Python
pycharm运行程序时在Python console窗口中运行的方法
Dec 03 Python
Python实现的登录验证系统完整案例【基于搭建的MVC框架】
Apr 12 Python
Python 保持登录状态进行接口测试的方法示例
Aug 06 Python
Python 如何创建一个线程池
Jul 28 Python
Python创建临时文件和文件夹
Aug 05 Python
python如何实时获取tcpdump输出
Sep 16 Python
Python实现对齐打印 format函数的用法
Apr 28 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 isset()与empty()的使用区别详解
2010/08/29 PHP
PHP 在5.1.* 和5.2.*之间 PDO数据库操作中的不同之处小结
2012/03/07 PHP
利用php+mcDropdown实现文件路径可在下拉框选择
2013/08/07 PHP
PHP数组游标实现对数组的各种操作详解
2016/01/26 PHP
Zend Framework教程之Loader以及PluginLoader用法详解
2016/03/09 PHP
ExtJs之带图片的下拉列表框插件
2010/03/04 Javascript
jQuery的.live()和.die() 使用介绍
2011/09/10 Javascript
自己实现string的substring方法 人民币小写转大写,数字反转,正则优化
2012/09/02 Javascript
js和jquery中循环的退出和继续下一个循环
2014/09/03 Javascript
jQuery文字提示与图片提示效果实现方法
2016/07/04 Javascript
浅谈JavaScript中面向对象的的深拷贝和浅拷贝
2016/08/01 Javascript
Vue.2.0.5过渡效果使用技巧
2017/03/16 Javascript
微信小程序富文本渲染引擎的详解
2017/09/30 Javascript
vue中的event bus非父子组件通信解析
2017/10/27 Javascript
Node.js中sequelize时区的配置方法
2017/12/10 Javascript
jQuery实现table表格信息的展开和缩小功能示例
2018/07/21 jQuery
axios全局注册,设置token,以及全局设置url请求网段的方法
2018/09/25 Javascript
解决vue动态路由异步加载import组件,加载不到module的问题
2020/07/26 Javascript
[02:07]2018DOTA2亚洲邀请赛主赛事第三日五佳镜头 fy极限反杀
2018/04/06 DOTA
[03:10]超级美酒第四天 fy拉比克秀 大合集
2018/06/05 DOTA
[46:55]LGD vs Liquid 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/19 DOTA
opencv导入头文件时报错#include的解决方法
2019/07/31 Python
pytorch 使用加载训练好的模型做inference
2020/02/20 Python
Python实现删除某列中含有空值的行的示例代码
2020/07/20 Python
HTML5重塑Web世界它将如何改变互联网
2012/12/17 HTML / CSS
基于html5 DeviceOrientation 实现微信摇一摇功能
2015/09/25 HTML / CSS
从零实现一个自定义html5播放器的示例代码
2017/08/01 HTML / CSS
个人找工作求职简历的自我评价
2013/10/20 职场文书
公司委托书范本
2014/04/04 职场文书
五水共治捐款倡议书
2014/05/14 职场文书
2014五年级班主任工作总结
2014/12/05 职场文书
初中信息技术教学计划
2015/01/22 职场文书
正能量励志演讲稿三分钟(范文)
2019/07/11 职场文书
详解Laravel框架的依赖注入功能
2021/05/27 PHP
一文搞懂MySQL索引页结构
2022/02/28 MySQL
SpringBoot详解整合Redis缓存方法
2022/07/15 Java/Android