爬虫利器 Beautiful Soup 之遍历文档

这篇具有很好参考价值的文章主要介绍了爬虫利器 Beautiful Soup 之遍历文档。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Beautiful Soup 简介

Beautiful Soup 是一个可以从 HTML 或 XML 文件中提取数据的 Python 库,它提供了一些简单的操作方式来帮助你处理文档导航,查找,修改文档等繁琐的工作。因为使用简单,所以 Beautiful Soup 会帮你节省不少的工作时间。

Beautiful Soup 安装

你可以使用如下命令安装 Beautiful Soup。二选一即可。

$ easy_install beautifulsoup4
$ pip install beautifulsoup4

Beautiful Soup 不仅支持 Python 标准库中的 HTML 解析器,还支持很多第三方的解析器,比如 lxml,html5lib 等。初始化 Beautiful Soup 对象时如果不指定解析器,那么 Beautiful Soup 将会选择最合适的解析器(前提是你的机器安装了该解析器)来解析文档,当然你也可以手动指定解析器。这里推荐大家使用 lxml 解析器,功能强大,方便快捷,而且该解析器是唯一支持 XML 的解析器。

你可以使用如下命令来安装 lxml 解析器。二选一即可。​​​​​​​

$ easy_install lxml
$ pip install lxml

Beautiful Soup 小试牛刀

Beautiful Soup 使用来起来非常简单,你只需要传入一个文件操作符或者一段文本即可得到一个构建完成的文档对象,有了该对象之后,就可以对该文档做一些我们想做的操作了。而传入的文本大都是通过爬虫爬取过来的,所以 Beautiful Soup 和 requests 库结合使用体验更佳。​​​​​​​

# demo 1from bs4 import BeautifulSoup# soup = BeautifulSoup(open("index.html"))soup = BeautifulSoup("<html><head><title>index</title></head><body>content</body></html>", "lxml") # 指定解析器print(soup.head)# 输出结果<head><title>index</title></head>

Beautiful Soup 将复杂的 HTML 文档转换成一个复杂的树形结构,每个节点都是 Python 对象,所有对象可以归纳为 4 种: Tag,NavigableString,BeautifulSoup,Comment。

Tag 就是 HTML 的一个标签,比如 div,p 标签等,也是我们用的最多的一个对象。

NavigableString 指标签内部的文字,直译就是可遍历的字符串。

BeautifulSoup 指一个文档的全部内容,可以当成一个 Tag 来处理。

Comment 是一个特殊的 NavigableString,其输出内容不包括注视内容。

为了故事的顺利发展,我们先定义一串 HTML 文本,下文的所有例子都是基于这段文本的。​​​​​​​

html_doc = """<html><head><title>index</title></head><body><p class="title"><b>首页</b></p><p class="main">我常用的网站<a href="https://www.google.com" class="website" id="google">Google</a><a href="https://www.baidu.com" class="website" id="baidu">Baidu</a><a href="https://cn.bing.com" class="website" id="bing">Bing</a></p><div><!--这是注释内容--></div><p class="content1">...</p><p class="content2">...</p></body>"""

子节点

Tag 有两个很重要的属性,name 和 attributes。期中 name 就是标签的名字,attributes 是标签属性。标签的名字和属性是可以被修改的,注意,这种修改会直接改变 BeautifulSoup 对象。​​​​​​​

# demo 2soup = BeautifulSoup(html_doc, "lxml");p_tag = soup.pprint(p_tag.name)print(p_tag["class"])print(p_tag.attrs)p_tag.name="myTag" # attrs 同样可被修改,操作同字典print(p_tag)#输出结果p['title']{'class': ['title']}<myTag class="title"><b>首页</b></myTag>

由以上例子我么可以看出,可以直接通过点属性的方法来获取 Tag,但是这种方法只能获取第一个标签。同时我们可以多次调用点属性这个方法,来获取更深层次的标签。​​​​​​​

# demo 3soup = BeautifulSoup(html_doc, "lxml");print(soup.p.b)#输出结果<b>首页</b>

如果想获得所有的某个名字的标签,则可以使用 find_all(tag_name) 函数。​​​​​​​

# demo 4soup = BeautifulSoup(html_doc, "lxml");a_tags=soup.find_all("a")print(a_tags)#输出结果[<a class="website" href="https://www.google.com" id="google">Google</a>, <a class="website" href="https://www.baidu.com" id="baidu">Baidu</a>, <a class="website" href="https://cn.bing.com" id="bing">Bing</a>]

我们可以使用 .contents 将 tag 以列表方式输出,即将 tag 的子节点格式化为列表,这很有用,意味着可以通过下标进行访问指定节点。同时我们还可以通过 .children 生成器对节点的子节点进行遍历。​​​​​​​

# demo 5soup = BeautifulSoup(html_doc, "lxml");head_tag=soup.headprint(head_tag)print(head_tag.contents)for child in head_tag.children:	print("child is : ", child)#输出结果<head><title>index</title></head>[<title>index</title>]child is :  <title>index</title>

.children 只可以获取 tag 的直接节点,而获取不到子孙节点,.descendants 可以满足你。​​​​​​​

# demo 6soup = BeautifulSoup(html_doc, "lxml");head_tag=soup.headfor child in head_tag.descendants:	print("child is : ", child)# 输出结果child is :  <title>index</title>child is :  index

父节点

通过 .parent 属性获取标签的父亲节点。title 的父标签是 head,html 的父标签是 BeautifulSoup 对象,而 BeautifulSoup 对象的父标签是 None。​​​​​​​

# demo 7soup = BeautifulSoup(html_doc, "lxml");title_tag=soup.titleprint(title_tag.parent)print(type(soup.html.parent))print(soup.parent)# 输出结果<head><title>index</title></head><class 'bs4.BeautifulSoup'>None

同时,我们可以通过 parents 得到指定标签的所有父亲标签。​​​​​​​

# demo 8soup = BeautifulSoup(html_doc, "lxml");a_tag=soup.afor parent in a_tag.parents:    print(parent.name)# 输出结果pbodyhtml[document]

兄弟节点

通过 .next_sibling 和 .previous_sibling 来获取下一个标签和上一个标签。​​​​​​​

# demo 9soup = BeautifulSoup(html_doc, "lxml");div_tag=soup.divprint(div_tag.next_sibling)print(div_tag.next_sibling.next_sibling)# 输出结果<p class="content1">...</p>

你可能会纳闷,调用了两次 next_sibling 怎么只有一个输出呢,这方法是不是有 bug 啊。事实上是 div 的第一个 next_sibling 是div 和 p 之间的换行符。这个规则对于 previous_sibling 同样适用。

另外,我们可以通过 .next_siblings 和 .previous_siblings 属性可以对当前节点的兄弟节点迭代输出。在该例子中,我们在每次输出前加了前缀,这样就可以更直观的看到 dib 的第一个 previous_sibling 是换行符了。​​​​​​​

# demo 10soup = BeautifulSoup(html_doc, "lxml");div_tag=soup.divfor pre_tag in div_tag.previous_siblings:	print("pre_tag is : ", pre_tag)# 输出结果pre_tag is :pre_tag is :  <p class="main">我常用的网站<a class="website" href="https://www.google.com" id="google">Google</a><a class="website" href="https://www.baidu.com" id="baidu">Baidu</a><a class="website" href="https://cn.bing.com" id="bing">Bing</a></p>pre_tag is :pre_tag is :  <p class="title"><b>首页</b></p>pre_tag is :

前进和后退

通过 .next_element 和 .previous_element 获取指定标签的前一个或者后一个被解析的对象,注意这个和兄弟节点是有所不同的,兄弟节点是指有相同父亲节点的子节点,而这个前一个或者后一个是按照文档的解析顺序来计算的。

比如在我们的文本 html_doc 中,head 的兄弟节点是 body(不考虑换行符),因为他们具有共同的父节点 html,但是 head 的下一个节点是 title。即soup.head.next_sibling=title soup.head.next_element=title。​​​​​​​

# demo 11soup = BeautifulSoup(html_doc, "lxml");head_tag=soup.headprint(head_tag.next_element)title_tag=soup.titleprint(title_tag.next_element)# 输出结果<title>index</title>index

同时这里还需要注意的是 title 下一个解析的标签不是 body,而是 title 标签内的内容,因为 html 的解析顺序是打开 title 标签,然后解析内容,最后关闭 title 标签。

另外,我们同样可以通过 .next_elements 和 .previous_elements 来迭代文档树。由遗下例子我们可以看出,换行符同样会占用解析顺序,与迭代兄弟节点效果一致。​​​​​​​

# demo 12soup = BeautifulSoup(html_doc, "lxml");div_tag=soup.divfor next_element in div_tag.next_elements:	print("next_element is : ", next_element)# 输出结果next_element is :  这是注释内容next_element is :next_element is :  <p class="content1">...</p>next_element is :  ...next_element is :next_element is :  <p class="content2">...</p>next_element is :  ...next_element is :next_element is :

Beautiful Soup 总结

本章节介绍了 Beautiful Soup 的使用场景以及操作文档树节点的基本操作,看似很多东西其实是有规律可循的,比如函数的命名,兄弟节点或者下一个节点的迭代函数都是获取单个节点函数的复数形式。

同时由于 HTML 或者 XML 这种循环嵌套的复杂文档结构,致使操作起来甚是麻烦,掌握了本文对节点的基本操作,将有助于提高你写爬虫程序的效率。文章来源地址https://www.toymoban.com/news/detail-492799.html

到了这里,关于爬虫利器 Beautiful Soup 之遍历文档的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 软件测试|Beautiful Soup库详细使用指南

    简介 Beautiful Soup是一款强大的Python库,广泛用于解析HTML和XML文档,从中提取数据并进行处理。它的灵活性和易用性使得数据抽取变得简单,本文将详细介绍Beautiful Soup库的基本用法和示例。 安装Beautiful Soup 首先,需要确保我们已经安装了Python。然后,可以使用以下命令通过

    2024年01月22日
    浏览(44)
  • API接口文档利器:Swagger 和 接口调试利器:Postman

    2.1.1Swagger介绍 Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务 (https://swagger.io/)。 它的主要作用是: 使得前后端分离开发更加方便,有利于团队协作 接口的文档在线自动生成,降低后端开发人员编写接口文档的负担 功能测试 Spring已经

    2024年02月11日
    浏览(40)
  • 爬虫利器一览

    爬虫(英文:spider),可以理解为简单的机器人,如此一个 “不为名利而活,只为数据而生,目标单纯,能量充沛,不怕日晒雨淋,不惧寒冬酷暑” 的家伙,真讨人喜欢~ 在博主的历史文章中,已对爬虫的原理机制、实践操作做了基本的介绍。 如感兴趣,可直接拖到文末,

    2024年01月23日
    浏览(32)
  • (十四)python网络爬虫(理论+实战)——爬虫利器selenium详解

    目录 6 selenium的介绍和使用      6.1 爬虫遇到的难点

    2023年04月08日
    浏览(42)
  • Python爬虫利器之Selenium

    Python Selenium是一个用于Web浏览器自动化的工具套件,主要用来模拟用户在浏览器中的行为,并且能够对浏览器进行自动化操作。下面是Python Selenium的详解,主要包括以下内容: 1.安装Python和Selenium 安装Python非常简单,只需要到官方网站下载安装包进行安装即可。安装Selenium也

    2024年02月06日
    浏览(32)
  • Python爬虫:打开盈利大门的利器

    随着互联网的迅速发展,越来越多的企业和个人开始意识到数据的重要性。而Python爬虫作为一种自动化获取互联网信息的技术,为人们提供了更便捷、高效的数据获取方式。本文将介绍基于Python爬虫的五种盈利模式,并提供实际案例供读者参考。 随着互联网时代的到来,数据

    2024年02月10日
    浏览(40)
  • 《亮数据:爬虫数据采集行业痛点的利器》

    ❤️作者主页:小虚竹 ❤️作者简介:大家好,我是小虚竹。2022年度博客之星评选TOP 10🏆,Java领域优质创作者🏆,CSDN博客专家🏆,华为云享专家🏆,掘金年度人气作者🏆,阿里云专家博主🏆,51CTO专家博主🏆 ❤️技术活,该赏 ❤️点赞 👍 收藏 ⭐再看,养成习惯 在数

    2024年04月15日
    浏览(41)
  • Python网络爬虫库:轻松提取网页数据的利器

          网络爬虫是一种自动化程序,它可以通过访问网页并提取所需的数据。Python是一种流行的编程语言,拥有许多强大的网络爬虫库。在本文中,我们将介绍几个常用的Python网络爬虫库以及它们的使用。 Requests库 Requests是一个简单而优雅的HTTP库,可以轻松地发送HTTP请求。

    2024年02月09日
    浏览(46)
  • 爬虫 + 自动化利器---selenium详解以及实战项目

    什么是selenium Selenium是一个用于Web应用程序测试的工具。 只要在测试用例中把预期的用户行为与结果都描述出来,我们就得到了一个可以自动化运行的功能测试套件。 Selenium测试套件直接运行在浏览器中,就像真正的用户在操作浏览器一样。 Selenium也是一款同样使用Apache Li

    2024年02月09日
    浏览(43)
  • 强大易用!新一代爬虫利器 Playwright 的介绍

    Playwright 是微软在 2020 年初开源的新一代自动化测试工具,它的功能类似于 Selenium、Pyppeteer 等,都可以驱动浏览器进行各种自动化操作。它的功能也非常强大,对市面上的主流浏览器都提供了支持,API 功能简洁又强大。虽然诞生比较晚,但是现在发展得非常火热。 因为 Pla

    2024年04月12日
    浏览(76)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包