分享

bs4介绍...

 羊玉wngbx 2022-07-31 发布于云南

目录:

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 = """
<html><head><title>The Dormouse's story</title></head>
<body>
<p class="title"><b>The Dormouse's story</b></p>

<p class="story">Once upon a time there were three little sisters; and their names were
<a href="http:///elsie" class="sister" id="link1">Elsie</a>,
<a href="http:///lacie" class="sister" id="link2">Lacie</a> and
<a href="http:///tillie" class="sister" id="link3">Tillie</a>;
and they lived at the bottom of a well.</p>

<p class="story">...</p>
"""

# 因为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)
  • 返回值:<title>The Dormouse's story</title>

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')
  • 返回值:
[<p class="title"><b>The Dormouse's story</b></p>, <p class="story">Once upon a time there were three little sisters; and their names were
<a class="sister" href="http:///elsie" id="link1">Elsie</a>,
<a class="sister" href="http:///lacie" id="link2">Lacie</a> and
<a class="sister" href="http:///tillie" id="link3">Tillie</a>;
and they lived at the bottom of a well.</p>, <p class="story">...</p>]

3.3.5:得到标签的属性值

  • 使用get('属性名’)方法
  • 代码
links = soup.find_all('a')
for link in links:
	print(link.get('href'))
  • 返回值
    • 返回的是这个属性的内容
http:///elsie
http:///lacie
http:///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当中的内容

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约