• 【爬虫知识】比lxml和bs4都要好?解析器parsel的使用


    文本提取

    爬虫程序中,一个非常重要的步骤就是从源代码中提取所需要的文本数据,提取的方法是非常多样的,比如说可以使用python内置的字符串函数,或者是使用正则表达式。如果是结构化的数据的话,可能还会用到json等

    当然,一般来说,像html这种格式的数据,使用通用的文本提取方式比较麻烦,效率不高。而通过xml的解析器的方式,直接提取数据,是较为容易的,常用的解析器有lxml以及beautifulsoup4

    关于lxml和bs4的优缺点,在往期的文章中我们也有过对比,简单概括的话,我们可以这样认为:一般来说,lxml更擅长于使用xpath的解析器,而bs4更擅长于使用css的解析器。当然,你会用任何一种都是可以的,并非要两种都学会,只是如果你更喜欢用xpath的话,可以考虑lxml,如果更喜欢css的话,可以考虑使用bs4

    这时候就有人有疑问了,“小孩子才做选择题,我全都要!为什么我不可以同时使用xpath和css呢?比如说我使用scrapy中的Selector不是更好吗?“

    确实如此,比如说之前我在这篇文章中对比了bs4和scrapy的Selector,结果证明Selector确实很好用,但是用的人却不多,这又是为什么呢?

    一个可能原因就是,很多人可能并不希望为了一个解析器要专门下载scrapy,好吧,这也就是本文的主题了,其实scrapy中的解析器,是可以单独下载使用的,它包含在parsel之中,如果你不希望下载scrapy,也可以通过pip install parsel来单独下载scrapy的解析器

    parsel的使用

    文本准备

    如果希望使用文本解析器,首先我们肯定需要有一段文本。这里我简单的写了一段html,就当作本文要解析的文本使用了,如下所示,我会默认将其保存到html变量中

    1. html>
    2. <html>
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>测试文档title>
    6. head>
    7. <body>
    8. <div class="wrapper">
    9. <div class="inner">
    10. <span class="content">这是第一部分的内容span>
    11. <img src="http://localhost/1.jpg" alt="图一">
    12. div>
    13. <div class="inner">
    14. <span class="content">这是第二部分的内容span>
    15. <img src="http://localhost/2.jpg" alt="图二">
    16. div>
    17. <div class="inner">
    18. <span class="content">这是第三部分的内容span>
    19. <img src="http://localhost/3.jpg" alt="图三">
    20. div>
    21. <div class="inner">
    22. <span class="content">这是第四部分的内容span>
    23. <img src="http://localhost/4.jpg" alt="图四">
    24. div>
    25. <div class="inner">
    26. <span class="content">这是第五部分的内容span>
    27. <img src="http://localhost/5.jpg" alt="图五">
    28. div>
    29. div>
    30. <br />
    31. <br />
    32. <input type="button" id="confirm" value="我已经都看完了" />
    33. <br />
    34. <br />
    35. <a class="index" href="http://localhost/index">点击进入主页a>
    36. body>
    37. html>

    使用xpath

    通过parsel中的Selector进行xpath的解析是很容易的,首先需要创建一个Selector对象,然后直接通过s.xpath()使用xpath,对于结果,如果需要得到一个使用get(),如果需要得到全部使用extract()

    1. from parsel import Selector
    2. # html中的内容应为上面我提供的html文本,出于篇幅考虑,我就不再将其复制一份
    3. s = Selector(html)
    4. # 提取所有span中的文本,此时得到的是一个列表
    5. r1 = s.xpath("//div[@class='inner']/span/text()").extract()
    6. print(r1)
    7. # 提取所有img的地址,此时得到的是一个列表
    8. r2 = s.xpath("//img/@src").extract()
    9. print(r2)
    10. # 提取一个a标签中的文本,此时得到的不再是一个列表
    11. r3 = s.xpath("//a/text()").get()
    12. print(r3)

    使用css

    同xpath,只需要将s.xpath()改为s.css()即可

    1. from parsel import Selector
    2. # html中的内容应为上面我提供的html文本,出于篇幅考虑,我就不再将其复制一份
    3. s = Selector(html)
    4. # 提取所有span中的文本,此时得到的是一个列表
    5. r1 = s.css(".inner span::text").extract()
    6. print(r1)
    7. # 提取所有img的地址,此时得到的是一个列表
    8. r2 = s.css("img::attr(src)").extract()
    9. print(r2)
    10. # 提取一个a标签中的文本,此时得到的不再是一个列表
    11. r3 = s.css("a::text").get()
    12. print(r3)

    使用正则表达式

    通过s.re()匹配所有,通过s.re_first()匹配一个,注意,正则表达式得到的结果无需使用extract()和get(),得到的就是所需的结果

    1. from parsel import Selector
    2. # html中的内容应为上面我提供的html文本,出于篇幅考虑,我就不再将其复制一份
    3. s = Selector(html)
    4. # 提取所有span中的文本,此时得到的是一个列表
    5. r1 = s.re("(.*?)")
    6. print(r1)
    7. # 提取所有img的地址,此时得到的是一个列表
    8. r2 = s.re(")
    9. print(r2)
    10. # 提取一个a标签中的文本,此时得到的不再是一个列表
    11. r3 = s.re_first("(.*?)")
    12. print(r3)

    这样看来的话,正则表达式的使用比起xpath和css要麻烦很多,确实如此,但是一般实际情况中不这么用,它可以和xpath以及css的解析器连用,先通过xpath和css提取,再通过正则匹配

    1. from parsel import Selector
    2. # html中的内容应为上面我提供的html文本,出于篇幅考虑,我就不再将其复制一份
    3. s = Selector(html)
    4. # 先通过xpath提取到input,然后通过正则匹配其中的内容
    5. r = s.xpath("//input").re_first("value=\"(.*?)\"")
    6. print(r)

    parsel的好处

    为什么我会认为parsel比起lxml和bs4都要好用呢?我认为它主要有以下几个优点

    第一,它的功能很全面,同时可以使用xpath,css以及re正则匹配,你想用哪个就可以用哪个,再也不用纠结了

    第二,它的使用更简单,比如说在初始化选择器的时候,只需要为其传入一段html就可以了,而xpath(),css(),re()的方法,也是直接就可以使用了,非常的方便啊

    第三,在使用get()的时候,如果得不到结果,不会报错,也不会忽略,而是给出None的结果,这个功能是非常有用的

    第四,它的通用性很高,在不使用scrapy写程序的时候,只要引入parsel中的Selector就可以使用了,而在使用scrapy写程序的时候自不必说,直接就可以使用了

    虽然,每个人都有自己的使用习惯,当然你也可能觉得lxml和bs4更适合你,这我并不否认。但是,我认为parsel的功能是非常好的,也是绝对非常值得你学习使用的


    如果你希望阅读更多关于parsel的资料,我强烈建议你看看崔庆才先生的文章,参考资料地址如下:崔庆才-新兴网页解析利器 parsel

  • 相关阅读:
    C++ Opencv视频检测
    Python list列表删除元素(4种方法)
    Sparse稀疏检索介绍与实践
    从0到1学SpringCloud——13 gateway RouteLocator配置路由规则
    Zig标准库:最全数据结构深度解析(1)
    怎么快速编辑视频
    pg 时间操作方法
    电商平台图片相似度搜索怎么实现的?
    基于昇腾计算语言AscendCL开发AI推理应用
    Springboot 整合 企业微信机器人助手推送消息
  • 原文地址:https://blog.csdn.net/sagegrass/article/details/125877072