热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Python爬虫之bs4库

Python爬虫之bs4库,Go语言社区,Golang程序员人脉社

python爬虫常用库之bs4


bs4全名BeautifulSoup,是编写python爬虫常用库之一,主要用来解析html标签。


1.安装

pip install beautifulsoup4

python -m pip install beautifulsoup4
2.基本使用方法

bs4中最基础的使用是BeautifulSoup类的使用,注意大小写哦。

用BeautifulSoup来解析html:

from bs4 import BeautifulSoup soup1 = BeautifulSoup(" A Html Text", "html.parser") soup2 = BeautifulSoup(open("d://demo.html"), "html.parser")两个参数:第一个参数是要解析的html文本,第二个参数是使用那种解析器,对于HTML来讲就是html.parser,这个是bs4自带的解析器。 还可以安装lxml库来解析HTML或者XML,安装html5lib来解析html5lib。

#lxml解析html(需pip install lxml) BeautifulSoup(html,'lxml') #lxml解析XML BeautifulSoup(xml,'xml') #html5lib解析(需安装: pip install html5lib) BeautifulSoup(html5,'html5lib')
2.1 BeautifulSoup基本元素

BeautifulSoup基本元素有:

基本元素 说明
Tag 标签,基本信息组织单元,用<>和标明开头和结尾
Name 标签的名字,

...

的名字就是’p',用法<>.name
Attributes 标签属性,字典形式,用法:<>.attrs['href']
NavigableString 标签内非属性字符串,

这是非属性字符串

,用法:<>.string
Comment 标签内的注释部分

显示的内容

2.1.1 Tag标签

任何存在于html语法中的标签都可以用soup.访问获得。

当HTML文档中存在多个相同的tag时,soup.返回第一个

>>> soup2 = BeautifulSoup("

The Contents of b in first p

The second p

","html.parser") >>> soup2.p

The Contents of b in first p


2.1.2 Tag的name

每个Tag都有自己的名字,通过.name获取,字符串类型

>>> soup2.p.name 'p'2.1.3 Tag的attrs(属性)

一个Tag可以有0个或多个属性,字典类型。

>>> soup2.p.attrs {'class': ['title']} >>> soup2.p.attrs['class'] ['title']
2.1.4 Tag的NavigableString

NavigableString可以跨越多个层次的标签。

>>> soup2.p

The Contents of b in first p

>>> soup2.p.string 'The Contents of b in first p' >>>
2.1.5 Tag 的Comment

Comment是一种特殊类型

>>> soup3 = BeautifulSoup("

This is a NavigableString

","html.parser") >>> soup3.p

This is a NavigableString

>>> soup3.b >>> soup3.p.string 'This is a NavigableString' >>> type(soup3.p.string) >>> soup3.b >>> soup3.b.string ' This is a Comment ' >>> type(soup3.b.string) >>>


....

p ->tag.name  'p'

class="title" -> tag.attrs (字典列表)

... -> NavigableString OR Comment

2.2 使用bs4遍历html内容

HTML是个树状结构,<>...构成了从属关系。对HTML的遍历,有下行遍历,上行遍历和平行遍历三种遍历途径或方法。

2.2.1 下行遍历

属性 说明
.contents 子节点的列表,将所有的儿子节点存入列表
.children 子节点的迭代类型,与.contents类似,主要用于循环遍历子节点
.descendants 子孙节点的迭代类型,包含所有子孙节点,用于循环遍历。

BeautifulSoup类型是标签树的根节点。

soup.head soup.head.contents soup.body.contents len(soup.body.contents) soup.body.contents[0]遍历子节点:

for child in soup.body.children: print(child)遍历所有子孙节点:

for child in soup.body.descendants: print(child)
2.2.2 上行遍历

属性 说明
.parent 节点的父节点
.parents 节点的先辈节点标签的迭代类型,用于循环遍历先辈节点。

>>> soup

The demo python introduces several python courses.

Python is a wonderful general-purpose programming language. You can learn Python from novice to professional by tracking the following courses: Basic Python and Advanced Python.

>>> soup.title.parent >>> soup.html.parent

The demo python introduces several python courses.

Python is a wonderful general-purpose programming language. You can learn Python from novice to professional by tracking the following courses: Basic Python and Advanced Python.

>>> soup.parent >>>
注意:..标签的父节点是其自身

而soup本身的父节点是空。

进行先辈节点遍历时,包括soup自身,实际使用时需要判断。

for parent in soup.a.parents: if parent is None: print(parent) else: print(parent.name)

2.2.3 平行遍历

属性 说明
.next_sibling 返回按照HTML文本顺序的下一个平行节点标签
.previous_sibling 返回按照HTML文本顺序的上一个平行节点标签
.next_siblings 迭代类型,返回按照HTML文本顺序的后续所有平行节点标签
.previous_siblings 迭代类型,返回按照HTML文本顺序的前续所有平行节点标签
平行遍历发生在同一个父节点下的各节点之间。

soup.a.next_sibling soup.a.next_sibling.nextsibling soup.a.previous_sibling soup.a.parent

遍历后续节点:

for sibling in soup.a.next_siblings: print(sibling)
遍历前续节点:

for sibling in previous_siblings: print(sibling)
3. 基于bs4库的HTML格式输出

3.1 prettify()方法

.prettify()为HTML文本<>及其内容增加‘n'

.prettify()可用于标签,方法.prettify()

print(soup.a.prettify())
3.2 bs4k库的编码

bs4库将任何HTML输入都变成utf-8编码,python3.x 默认支持编码是utf-8。完美匹配!


4.使用bs4进行HTML内容查找

使用bs4进行HTML内容解析查找,基本方法是使用<>.find_all()来进行

4.1 .find_all()的基本使用方法

基本格式:

.find_all(name, attrs, recursive, string, **kwargs)

其返回值为一个列表,存储查找的结果

参数:

name -> 对标签名称的检索字符串,可以是个字符串列表,表达“或”关系

soup.find_all('a') soup.find_all(['a','b']) soup.find_all(True)


attrs -> 对标签属性值的检索字符串,可标注属性检索

soup.find_all('a', 'title') soup.find_all(id='link1') soup.find_all(attrs = {"class":"course"})
recursive -> 是否对子孙全部检索,默认True

string -> <>...中的....的检索字符串

soup.find_all(string = 'This is a sample')


因为find_all太常用了,所以有简略用法:

(...) <--> .find_all(...)

soup(...) <--> soup.find_all(...)

程序员果然都是懒人..........大笑

4.2 扩展方法

方法 说明
<>.find() 搜索且只返回一个结果,同.find_all()参数
<>.find_parents() 在先辈节点中搜索,返回列表类型,同.find_all()参数
<>.find_parent() 在先辈节点中返回一个结果,同.find()参数
<>.find_next_siblings() 在后续平行节点中搜索,返回列表类型,同find_all()参数
<>.find_next_sibling() 在后续平行节点中搜索,返回一个结果,同find()参数
<>.find_previous_siblings() 在前续平行节点中搜索,返回列表类型,同find_all()参数
<>.find_previous_sibling() 在前续平行节点中搜索,返回一个结果,同find()参数


推荐阅读
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 推荐系统遇上深度学习(十七)详解推荐系统中的常用评测指标
    原创:石晓文小小挖掘机2018-06-18笔者是一个痴迷于挖掘数据中的价值的学习人,希望在平日的工作学习中,挖掘数据的价值, ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • Oracle分析函数first_value()和last_value()的用法及原理
    本文介绍了Oracle分析函数first_value()和last_value()的用法和原理,以及在查询销售记录日期和部门中的应用。通过示例和解释,详细说明了first_value()和last_value()的功能和不同之处。同时,对于last_value()的结果出现不一样的情况进行了解释,并提供了理解last_value()默认统计范围的方法。该文对于使用Oracle分析函数的开发人员和数据库管理员具有参考价值。 ... [详细]
author-avatar
PN喜欢建设城市ae
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有