Python 之Beautiful Soup入门文档

  • Post author:
  • Post category:python


官方文档:https://beautifulsoup.readthedocs.io/zh_CN/v4.4.0/



一、安装

pip install beautifulsoup4



二、基本使用

导入并将 html 转成 unicode

from bs4 import BeautifulSoup
soup = BeautifulSoup(open("index.html"))
soup = BeautifulSoup("<html>data</html>")

如果只想得到tag中包含的文本内容,可以使用

get_text()



2.1 对象种类

  • Tag(标签)
  • NavigableString(标签内的字符串)
  • BeautifulSoup(特殊Tag,文档的全部内容,可遍历和搜索)
  • Comment(特殊类型的 NavigableString 对象)



2.2 Tag(标签)

Tag 是什么?通俗点讲就是 HTML 中的一个个标签,以豆瓣电影排行榜某段html 为例:

<a href="https://movie.douban.com/subject/1292052/" class=""> 
 <span class="title">肖申克的救赎</span>
 <span class="title"> / The Shawshank Redemption</span>
 <span class="other"> / 月黑高飞()  /  刺激1995()</span>
 <span class="playable">[可播放]</span>
</a>
  • tag: a和 span
  • attrs(属性):class=“title”、class=“other”和href=”https://movie.douban.com/subject/1292052/”等等



name

Tag.a 标签即代表了所有的信息

print(soup.a)
# <a class="" href="https://movie.douban.com/subject/1292052/"> <span class="title">肖申克的救赎</span>
<span class="title"> / The Shawshank Redemption</span>
<span class="other"> / 月黑高飞()  /  刺激1995()</span>
<span class="playable">[可播放]</span>
</a>



Attributes

print(soup.span['class’])
# ['title']



2.3 NavigableString

已经得到了标签的内容,那么问题来了,我们要想获取标签内部的文字怎么办呢?很简单,用 .string 即可,例如:

print(soup.a.string)
# 肖申克的救赎



2.4 BeautifulSoup

BeautifulSoup 对象表示的是一个文档的全部内容.大部分时候,可以把它当作 Tag 对象,是一个特殊的 Tag,我们可以分别获取它的类型,名称,以及属性来感受一下

print(type(soup.a))
# <class 'bs4.element.Tag'>

print(soup.name)
#[document]
print(soup.attrs )
#{}



2.5. Comment

Tag , NavigableString , BeautifulSoup 几乎覆盖了html和xml中的所有内容,但是还有一些特殊对象.容易让人担心的内容是文档的注释部分:

markup = "<b><!--Hey, buddy. Want to buy a used parser?--></b>"
soup = BeautifulSoup(markup)
comment = soup.b.string
type(comment)
# <class 'bs4.element.Comment'>

可以comment 对象会使用特殊的格式输出:

print(soup.b.prettify())
# <b>
#  <!--Hey, buddy. Want to buy a used parser?-->
# </b>



三、进阶-遍历

首先了解下DOM树:

在这里插入图片描述

在这里插入图片描述



四、核心-查找

find_all() 方法唯一的区别是 find_all() 方法的返回结果是值包含一个元素的列表,而 find() 方法直接返回结果

find( name , attrs , recursive , text , **kwargs )

参数解析:

  • name:所有名字为 name 的tag
  • attrs:属性
  • Recursive:Beautiful Soup会检索当前tag的所有子孙节点,如果只想搜索tag的直接子节点,可以使用参数



版权声明:本文为qinglianchen0851原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。