bs4介绍

目录:

  • 1:bs4 简介
    • 1.1:bs4是什么
    • 1.2:有什么用
    • 1.3:有什么意义
  • 2:bs4源码分析
    • 2.1:为什么分析源码
  • 3:bs4快速入门
    • 3.1:创建一个soup对象
    • 3.2:bs4、xpath和re的比较
    • 3.3:bs4常用方法
      • 3.3.1:获取一个标签及标签里面的内容
      • 3.3.2:只获取一个标签里面的内容,不获取标签
    • 3.3.3:只获取标签名
      • 3.3.4:获取多个标签
      • 3.3.5:得到标签的属性值
  • 4:bs4的对象种类(了解)
    • 4.1:tag使用方法
    • 4.2:NavigableString 使用方法
    • 4.3:BeautifulSoup使用方法
    • 4.4:Comment使用方法
  • 5:遍历文档树
            • ontents、children、descendants方法总结
            • string、strings、stripped_strings方法总结
            • 遍历文档树 遍历父节点,parent 和 parents
            • 遍历文档树 遍历兄弟结点
  • 6:find()和find_all()方法(重点)
    • 6.1:字符串过滤器
    • 6.2:列表过滤器
    • 6.3:寻找符合我们所要条件的标签
      • 6.3.1:使用索引的方式获取
      • 6.3.2:使用关键字进行索引
    • 6.4:获取标签属性的方法
      • 6.4.1:使用get()方法
  • 7:select介绍
    • 7.1:select与find和find_all的区别
    • 7.2:select的常用方法
      • 7.2.1:通过标签名来查找元素
      • 7.2.2:通过class来查找元素
      • 7.2.3:通过id来查找元素
      • 7.2.4:特殊的查找方式
  • 7.3:寻找标签中的文本内容
      • 7.3.1:select的返回类型
      • 7.3.2:返回一个标签里面的文本内容
      • 7.3.3:返回多的标签里面的数据
  • 8:修改文档树
    • 8.1:修改Tag的名称和属性
      • 修改Tag的名称
      • 修改Tag的属性
    • 8.2:其它修改方法

1:bs4 简介

  • 主要是对bs4模块的介绍

1.1:bs4是什么

  • bs4全称:beautifulsoup4,意思为美丽的汤版本4
  • 可以在HTML或XML文件中提取数据的网页信息提取库

1.2:有什么用

  • 可以解析和提取网页中的数据

1.3:有什么意义

  • pc端网络中抓取数据如:百度网站、腾讯网站等,随着的网络种类的增多,我们应该去寻找解析这个网站最适合的解析方法
  • 与re和xpath模块的区别:
    • re模块:使用起来过于麻烦且阅读性不好
    • xpath模块:需要使用一些特定的语法
    • bs4模块:只需要记住一些方法如:find()、find_all(),后面会发现bs4可以认为是re和xpath的混合使用
  • 总结
    • 在爬取不同的网站的时候,寻找最适合的解析数据方法
    • 可以与别的解析方法进行比较

2:bs4源码分析

  • 分析bs4的源码用来提高对bs4模块的认识
  • 源码下载:github下载源码
  • 安装模块:先安装lxml模块,在安装bs4模块

2.1:为什么分析源码

  • 了解原理、了解工作方法
  • 学习思路
  • 开发者必备的一项技能

3:bs4快速入门

  • bs4是依赖lxml库的,只有先安装lxml库才可以安装bs4库

3.1:创建一个soup对象

from bs4 import BeautifulSoup

html_doc = """
The Dormouse's story

The Dormouse's story

Once upon a time there were three little sisters; and their names were Elsie, Lacie and Tillie; and they lived at the bottom of a well.

...

""" # 因为BeautifulSoup是一个类,所以要实例化类,参数html_doc是要转化为soup对象的数据,features则是要转化为soup对象时编码的方法 soup = BeautifulSoup(html_doc, features="lxml") # prettify:意思是把soup对象漂亮的打印出来 print(soup.prettify())
  • features=“lxml”:解析器,就是把lxml数据转化为soup数据的编码方法

3.2:bs4、xpath和re的比较

  • 1:re模块:语法简单,但是不好编写而且阅读性差
  • 2:xpath模块:使用方法简单,但是要记住xpath语法,并且在使用的时候还要把数据转化为element对象才可以使用xpath语法进行索引导航
  • 3:bs4:可以说是re模块和xpath模块的混合版,可以使用特定的字符串来索引,并且不需要把数据进行转化,但是要对数据进行编译为soup对象,才可以使用soup对象中的方法
  • 总结:这三种解析数据的方法都各有利弊,我们在解析网页数据的时候,只要寻找最合适的解析数据的方法就可以了,这三个解析方法没有没有高低之分,只要找到最合适的解析方法就合适了。

3.3:bs4常用方法

3.3.1:获取一个标签及标签里面的内容

  • 语法:soup.tag_name
    print(soup.title)
  • 返回值:The Dormouse's story

3.3.2:只获取一个标签里面的内容,不获取标签

  • 语法:soup.title.string
print(soup.title.string)
  • 返回值:The Dormouse's story

3.3.3:只获取标签名

  • 语法:soup.title.name
    print(soup.title.name)
  • 返回值:title
  • 总结:感觉这个方法没有什么用,因为我们就是通过标签名来获取标签名的

3.3.4:获取多个标签

  • soup.title:只可以获取一个数据为title的标签数据,但是要多个title标签的时候只返回第一个title标签
  • find_all(‘a’):可以获得所有的标签a,以一个列表的形式返回
    soup.find_all('a')
  • 返回值:
[

The Dormouse's story

,

Once upon a time there were three little sisters; and their names were Elsie, Lacie and Tillie; and they lived at the bottom of a well.

,

...

]

3.3.5:得到标签的属性值

  • 使用get(‘属性名’)方法
  • 代码
links = soup.find_all('a')
for link in links:
	print(link.get('href'))
  • 返回值
    • 返回的是这个属性的内容
http://example.com/elsie
http://example.com/lacie
http://example.com/tillie

4:bs4的对象种类(了解)

  • 主要有
    • tag : 标签
    • NavigableString : 可导航的字符串
    • BeautifulSoup : bs对象
    • Comment : 注释

4.1:tag使用方法

  • soup.title
  • 结果:获得的是一个标签的标签和内容

4.2:NavigableString 使用方法

  • soup.title.string
  • 结果:获得的是一个标签里面的数据

4.3:BeautifulSoup使用方法

  • 我们一直在使用这个方法,用来创建一个bs4(soup)对象
  • 结果:一个soup对象

4.4:Comment使用方法

  • soup.string
  • 如果标签的内容为注释内容返回的就是Comment对象

5:遍历文档树

  • bs里面有三种情况,第一个是遍历,第二个是查找,第三个是修改
ontents、children、descendants方法总结
方法名 描述
contents 返回的是一个所有子节点的列表
children 返回的是一个子节点的迭代器通
descendants 返回的是一个生成器遍历子子孙孙
string、strings、stripped_strings方法总结
方法名 描述
string 获取标签里面的内容
strings 返回是一个生成器对象用过来获取多个标签内容
stripped_strings 和strings基本一致 但是它可以把多余的空格去掉
遍历文档树 遍历父节点,parent 和 parents
方法名 描述
parent 直接获得父节点
parents 获取所有的父节点
  • 注意:html的父节点为所有的数据
遍历文档树 遍历兄弟结点
方法名 描述
next_sibling 下一个兄弟结点
previous_sibling 上一个兄弟结点
next_siblings 下一个所有兄弟结点
previous_siblings 上一个所有兄弟结点

6:find()和find_all()方法(重点)

  • 是两个方法,需要传递参数
  • 有字符串过滤器和列表过滤器,用来过滤不需要的数据(无用的数据)

6.1:字符串过滤器

  • 可以找到一个符合条件的数据
  • 1:语法:soup.find('a')
    • 与soup.a的作用一样
    • 作用:获取数据中的第一个’a’标签
  • 2:soup.find_all(‘a’)
  • 作用:获取数据中所有’a’标签的数据

6.2:列表过滤器

  • 可以同时获取多个想要的数据
  • soup.find_all[‘title’, ‘a’]
  • 要筛选的数据用列表封装
  • 作用:返回数据中所有的’title’标签和’a’标签

6.3:寻找符合我们所要条件的标签

  • 也就是有目的的获取数据

6.3.1:使用索引的方式获取

  • soup.find_all(‘a’)[1]
  • 作用:获取符合要求的第二个标签数据

6.3.2:使用关键字进行索引

  • 1:soup.find_all(‘a’, class_=‘even’)
    • 作用:获取class属性为’even’的’a’标签
    • 注意:因为class被python团队使用了作为python的关键字所以使用class_,在python中**“class"等效于"class_”**
  • 2:如果不想使用class_可以使用一个字典来进行索引
    • 需要使用关键字’attrs’
  • 3:获取多个限制条件的索引
    • soup.find_all(‘a’, id=‘text’, class_=‘text’)
    • 作用:获取同时有id='text’和class='text’的’a’标签

6.4:获取标签属性的方法

6.4.1:使用get()方法

  • 1:a.get(‘href’)
  • 作用:获取标签a的href属性值
  • 2:a[‘href’]
  • 作用:和a.get(‘href’)是等价的

7:select介绍

  • 主要是介绍select解析网页的一些方法

7.1:select与find和find_all的区别

  • select和find_all的作用是一样的
  • select_one的作用和find的作用是一样的

7.2:select的常用方法

  • 主要介绍如何通过标签吗名、类名、id和一些特殊的方法来查找查找数据

7.2.1:通过标签名来查找元素

  • 语法:soup.select("a")
  • 返回值:以列表,返回soup中的所有“a”标签

7.2.2:通过class来查找元素

  • 语法:soup.elect('.info')
  • 返回值:以列表的形式返回soup中,所有class属性为"info"的标签

7.2.3:通过id来查找元素

  • 语法:soup.elect("#link")
  • 返回值:以列表的形式返回soup中,所有id属性为"link"d的标签

7.2.4:特殊的查找方式

  • 语法:soup.elect("div>p")
  • 返回值:一列表的形式返回soup中,所有父标签为“div”的"p"标签

7.3:寻找标签中的文本内容

  • 返回的是一个标签里面的文本内容

7.3.1:select的返回类型

  • 返回的是一个列表类型

7.3.2:返回一个标签里面的文本内容

  • 语法:soup.elect("a").string
  • 返回值:返回这个标签的文本内容
  • 可以把这个语法换为:soup.elect('a').get_text,两者的作用是一样的

7.3.3:返回多的标签里面的数据

  • 语法:soup.elect('a').strings
  • 返回值:返回soup中所有a,标签的文档数据的一个生成器

8:修改文档树

  • 主要介绍修改tag、string、添加内容和删除内容的方法
  • 其做法和python语法里面的赋值语法相似

8.1:修改Tag的名称和属性

修改Tag的名称

  • 语法:soup.name=new_name
  • 返回值:把soup中name的Tag属性换为new_name

修改Tag的属性

  • 语法:soup.Tag[class]='new_class'
  • 返回值:把soup中tag的class属性转换为new_class

8.2:其它修改方法

  • string:修改标签的文档属性
  • append:向Tag当中添加内容
  • delcompose:删除Tag当中的内容

你可能感兴趣的:(python,爬虫)