BeautifulSoup模块基本使用方法(解析—提取数据)

一、了解BeautifulSoup

1、简介

一个灵活又方便的网页解析库,最主要的功能是从网页抓取数据,处理高效,支持多种解析器,
它通过转换器实现文档导航、查找、修改文档的方式。

利用它可不用编写正则也能方便的实现网页信息的抓取;

2、安装

pip3 install BeautifulSoup4
BeautifulSoup默认支持Python的标准HTML解析库,但它也支持一些第三方的解析库:


如果我们没有安装,则 Python 会使用 Python默认的解析器,不过在实际操作中,
更推荐使用lxm解析器,速度快而且稳定。

BeautifulSoup模块可帮助解析html和xml文档中的内容,尤其是在爬取特定网页信息的时候,
用于解析和检查在网上看到的那些乱七八糟而且不规范的HTML页面。

二、BeautifulSoup基本运用

1、创建对象

解析的第一步,是构建一个BeautifulSoup对象,基本用法:


此处提示两点:

① BeautifulSoup中的B和S需大写,小写会报错;

② BeautifulSoup自动将输入文档转换为Unicode编码,输出文档转换为utf-8编码,
所以当使用requests.get获得HTML文档后用它进行处理时,不需要考虑编码方式。

2、对象的种类

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

Tag
NavigableString
BeautifulSoup
Comment
1)Tag

通俗点讲就是HTML中的一个个标签;

利用 soup加标签名轻松地获取这些标签的内容;
它查找的是在所有内容中的第一个符合要求的标签;
这些对象的类型是<class 'bs4.element.Tag'>;
Tag对象的两个重要属性:name、attrs;
name:输出标签的标签类型名
attrs:以字典的形式获取标签的属性,既然利用attr获得的是字典对象,那么也是可以修改和删除的

2)NavigableString

如果拿到标签后,还想获取标签中的内容,则可以通过tag.string获取标签中的文字。

作用:获取标签内部的文字;
直译:可遍历的字符串;
使用方法:soup.p.string;
对象类型:<class 'bs4.element.NavigableString'>3)BeautifulSoup

它支持遍历文档树和搜索文档树中描述的大部分方法;

文档对象,也就是整个文档的内容;
可以当做是一个Tag对象;

4)Comment

Tag,NavigableString,BeautifulSoup几乎覆盖了html和xml中的所有内容,
但是还有一些特殊对象,Comment对象用于操作文档的注释部分。

Coment对象是一个特殊类型的NavigableString对象;
如果标签内部的内容是注释,例如:<!-- Elsie -->;那么该NavigableSring对象会转换成Comment对象,
并且会把注释符号去掉。

3、遍历文档树

1)子节点:

一个 Tag 可能包含多个字符串或其它的 Tag,这些都是这个 Tag 的子节点。
BeautifulSoup 提供了许多操作和遍历子节点的属性。

操作文档树最简单的方法就是告诉它你想获取的 tag 的 name。


通过(.)取属性的方式只能获得当前名字的第一个 tag。要得到所有<a>标签,可以用find_all('a')的方法。

.contents:获取Tag的所有子节点,返回一个list.children:获取Tag的所有子节点,返回一个生成器;


.descendants:获取Tag的所有子孙节点;

.strings:如果Tag包含多个字符串,即在子孙节点中有内容,可以用此获取,而后进行遍历;

.stripped_strings:与strings用法一致,只不过可以去除掉那些多余的空白内容;

2)父节点:

.parent:获取Tag的父节点;

.parents:递归得到父辈元素的所有节点,返回一个生成器;

3)兄弟节点:

.previous_sibling:获取当前Tag的上一个节点,属性通常是字符串或空白,
真实结果是当前标签与上一个标签之间的顿号和换行符。

.next_sibling:获取当前Tag的下一个节点,属性通常是字符串或空白,
真是结果是当前标签与下一个标签之间的顿号与换行符。

.previous_siblings:获取当前Tag的上面所有的兄弟节点,返回一个生成器;

.next_siblings:获取当前Tag的下面所有的兄弟节点,返回一个生成器;

.previous_element:获取解析过程中上一个被解析的对象(字符串或tag),
可能与previous_sibling相同,但通常是不一样的。

4)前进和回退:

.next_element:获取解析过程中下一个被解析的对象(字符串或tag),可能与next_sibling相同,
但通常是不一样的。

.previous_elements:返回一个生成器,可以向前访问文档的解析内容;

.next_elements:返回一个生成器,可以向后访问文档的解析内容;

4、BeautifulSoup的几种遍历方式

1)下行遍历

2)上行遍历


遍历所有先辈节点,包括soup本身,所以要区分辨别;

3)平行遍历

平行遍历必须发生在同一个父节点下的各子节点;

5、查找元素之 find find_all

① find返回单个元素,find_all返回所有元素;

② 返回的都是列表,每个元素都是一个bs4.element.Tag对象;

③ 获取包含的文本值:tag.text;

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

查找一个元素节点,返回第一个满足要求的节点信息;


(2)find_all( name , attrs , recursive , text , **kwargs )

可根据标签名、属性、内容查找文档,返回所有符合条件的内容;


find_parents() find_parent():
find_parents()返回所有祖先节点,find_parent()返回直接父节点;
find_next_siblings() find_next_sibling():
find_next_siblings()返回后面所有兄弟节点,find_next_sibling()返回后面第一个兄弟节点。
find_previous_siblings() find_previous_sibling():
find_previous_siblings()返回前面所有兄弟节点,find_previous_sibling()返回前面第一个兄弟节点。
find_all_next() find_next():
find_all_next()返回节点后所有符合条件的节点,find_next()返回第一个符合条件的节点;
find_all_previous() 和 find_previous():
find_all_previous()返回节点后所有符合条件的节点, find_previous()返回第一个符合条件的节点

三、BeautifulSoup使用css语法查找元素

1)tag.select(css):tag是HTML文档中的一个元素节点;

css一般结构:[tagName][attName][=value] 全是可选的,表示元素名称,元素属性,元素属性的值。

(2)属性的语法:

[attName]:选取带有指定属性的每个元素

[attName=value]:选取带有指定属性和值的每个元素

[aattName^=value]:匹配属性值以value开头的每个元素

[attName$=value]:匹配属性值以value结尾的每个元素

[attName*=value]:匹配属性值包含value的每个元素

(3)遍历:

css有多个节点时,空格分开:

soup.select("div p"):查找div节点下所有子孙p节点的信息

soup.select("div > p"):查找div节点下所有直接子节点p的信息

soup.select("div ~ p"):查找div后面所有同级别兄弟节点p的信息

soup.select("div + p"):查找前一个节点后面所有同级别兄弟节点的信息

结语:

BeautifulSoup是一个非常强大的工具,通过解析文档为用户提供需要抓取的数据,
利用它可以省去很多繁琐的提取工作,提高解析效率。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值