Python之BeautifulSoup库详解

这篇具有很好参考价值的文章主要介绍了Python之BeautifulSoup库详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、简介

BeautifulSoup是一个灵活方便的网页解析库,处理高效,能够自动的将输入文档转换为Unicode编码,输出文档转换为utf-8编码,且支持多种解析器。其最主要的功能是从网页抓取数据。

二、解析器

解析器 使用方法 优势 劣势
Python标准库 BeautifulSoup(markup, ‘html.parser’) python内置的标准库,执行速度适中 Python3.2.2之前的版本容错能力差
lxml HTML解析器 BeautifulSoup(markup, ‘lxml’) 速度快、文档容错能力强 需要安装C语言库
lxml XML解析器 BeautifulSoup(markup ‘xml’) 速度快,唯一支持XML的解析器 需要安装C语言库
html5lib BeautifulSoup(markup, ‘html5lib’) 最好的容错性、以浏览器的方式解析文档、生成HTML5格式的文档 速度慢,不依赖外部拓展

三、基本使用步骤

3.1 获取网页源码也可以通过字符串自己构建一个网页的源码
# 给请求指定一个请求头来模拟chrome浏览器
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36'}
# 爬图地址
addr = 'https://sc.chinaz.com/tupian/'

def getHtmlSource():
	# 使用请求头来模拟chrome浏览器访问网页,获取页面响应结果
    res = requests.get(addr, headers=headers).text
    print(res)

requests.get().text返回的是Unicode型的数据,requests.get().content返回的是bytes型的数据。如果只是使用.text来获取页面源码的话,获取的源码中中文会乱码。可以使用一下方法解决中文乱码:
(1)手动指定页面编码

    res = requests.get(addr, headers=headers)
    res.encoding = 'UTF-8'
    html_doc = res.text

(2)使用.content方法

    html_doc = str(requests.get(addr, headers=headers).content, 'UTF-8')
3.2 使用解析器解析页面响应结果
# 使用自带的html.parser解析页面响应结果
soup = BeautifulSoup(html_doc, 'html.parser')
# 使用lxml HTML解析器解析页面响应结果
soup = BeautifulSoup(html_doc, 'lxml')
# 使用lxml XML解析器解析页面响应结果
soup = BeautifulSoup(html_doc, 'xml')
# 使用html5lib解析页面响应结果
soup = BeautifulSoup(html_doc, 'html5lib')

四、四大对象种类

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

  • Tag
  • NavigableString
  • BeautifulSoup
  • Comment
4.1 Tag

Tag 通俗点讲就是 HTML 中的一个个标签,例如:titleheadap等等 HTML 标签加上里面包括的内容就是 Tag。但是注意,它查找的是在所有内容中的第一个符合要求的标签。

# 创建BeautifulSoup对象
soup = BeautifulSoup(html_doc, 'html.parser')
# 通过Tag对象获取title标签信息
print(soup.title)
## <title>图片、图片下载、高清图片材</title>

# 通过Tag对象获取a标签信息
print(soup.a)
## <a class="logo" href="/"><img src="../static/common/com_images/image.png"/></a>

Tag 它有两个重要的属性,是 name 和 attrs。
(1) name: 输出标签的标签类型名:

print(soup.title.name)
# title
print(soup.p.name)
# p

(2) attrs: 以字典的形式获取标签的属性:

 # 获取标签的所有属性
 soup.p.attrs
 # 获取标签的某个属性
 soup.p.attrs['js-do']
 soup.p.get('js-do')	
 # 修改标签的属性
 soup.p.attrs['js-do'] = 'newContenct'
 # 删除标签的属性
 del soup.p.attrs['js-do']
4.2 NavigableString

注意作用是为了获取标签内部的文字。

# 获取标签内部文字
print(soup.title.string)
4.3 BeautifulSoup

BeautifulSoup 对象表示的是一个文档的内容。大部分时候,可以把它当作 Tag 对象,是一个特殊的 Tag,我们也可以获取它的属性及名称。

# 获取BeautifulSoup对象名称
print(soup.name)
# 获取BeautifulSoup对象属性
print(soup.attr)
4.4 Comment

Comment 对象是一个特殊类型的 NavigableString 对象,如果标签内部的内容是注释,其输出的内容不包括注释符号。

print(soup.a)
## <a class="logo" href=""><!-- zhushi --></a>
print(soup.a.string)
## zhushi
print(type(soup.a.string))
## <class 'bs4.element.Comment'>

五、搜索文档树

find(name, attrs, recursive, string, **kwargs):获取匹配的第一个标签;
find_all(name, attrs, recursive, string, limit, **kwargs) :返回结果是值包含一个元素的列表;

  • name:是根据标签的名称进行匹配,name的值相当于过滤条件,可以是一个具体的标签名,多个标签名组成的列表,或者是一个正在表达式,甚至是函数方法等等。
  • attrs:是根据标签的属性进行匹配。
  • recursive:是否递归搜索,默认为True,会搜索当前tag的所有子孙节点,设置为False,则只搜索儿子节点。
  • string:是根据标签的文本内容去匹配。
  • limit:设置查询的结果数量。
  • kwargs:也是根据标签的属性进行匹配,与attrs的区别在于写法不一样,且属性的key不能是保留字,也不能与其他参数名相同。
5.1 使用name进行匹配
# 查找所有的<a>标签
soup.find_all(name="a") # 可以简写成 soup.find_all("a")

# 查找所有的<title>标签或者<link>标签
soup.find_all(name={'title', 'link'}) # 可以简写成 soup.find_all(['title', 'link']) 

# 查找所有以a开头的标签
soup.find_all(name=re.compile("^a")) # 可以简写成 soup.find_all(re.compile("^a")) 

# 查找有class属性并且没有id属性的节点
soup.find_all(hasClassNoId)
def hasClassNoId(tag):
    return tag.has_attr('class') and not tag.has_attr('id')
    
# 查找body里面所有标签
soup.find('body').find_all(True)
5.2 使用attrs进行匹配
# 查找所有name属性值为tb_name的标签
soup.find_all(attrs={"name": "tb_name"})

# 查找所有id属性值为id_attr1或者id_attr2的标签
soup.find_all(attrs={'id': ['id_attr1', 'id_attr2']})

# 查找id属性值中含有id_的所有标签
soup.find_all(attrs={'id':re.compiles('id_')})

# 查找含有id属性的所有tag
soup.find_all(attrs={'id':True})

# 查找href属性值中以.html结尾的所有标签
soup.find_all(attrs={'href': search_html})
def search_html(attr):
    return attr and attr.lower().endswith('.html')
5.3 使用kwargs进行匹配

也是通过标签的属性进行匹配,需要特别注意的是name属性以及class属性,name属于与find_all方法的第一个参数名相同,这里使用name='属性值'进行查询的话,如果是一个参数会与标签名进行匹配,如果是多个参数,则方法会报错;而class是python的保留字,使用class属性进行匹配的时候需要写成class_='属性值'的方式

# 查找<div>中name属性值是backpage的所有标签
soup.find_all('div', name='backpage')  ## 会报错

# 查找class属性值是backpage的所有标签
soup.find_all(class_='backpage')

# 查找所有id属性值为id_attr1或者id_attr2的标签
soup.find_all(id=['id_attr1', 'id_attr2'])

# 查找href的属性值包含.html的所有的标签
soup.find_all(href=re.compile('.html'))

# 查找含有id属性的所有tag
soup.find_all(id=True)

# 查找href属性值中以.html结尾的所有标签
soup.find_all(href= search_html)
def search_html(attr):
    return attr and attr.lower().endswith('.html')
5.4 使用string进行匹配

需要注意的是这里返回标签的值,如果需要获取到对应的标签,可以使用previous_element属性来获得

# 查找标签的value是'上一页'的所有value值
soup.find_all(string='上一页')

# 查找标签的value是'上一页'的所有标签
[value.previous_element for value in soup.find_all(string='上一页')]

# 查找value是'上一页'或者'下一页'的所有value值
soup.find_all(string=['上一页','下一页'])

# 查找value中存在'页'的所有value值
soup.find_all(string=re.compile('页'))

# 查找在value值的所有的string
soup.find_all(string=True)

# 查找所有value值是以'页'为结尾的value值
soup.find_all(string=search_string)
def search_string(string):
    return string and string.lower().endswith('页')

六、遍历文档树

  • contents:返回的是一个包含所有儿子节点的列表。
  • children:返回的是一个包含所有儿子节点的迭代器。
  • descendants:返回的是一个包含所有子孙节点的生成器。

contents、children只包含直接儿子节点,descendants既包含儿子节点还包含孙子节点。

6.1 通过contents获取目标节点的所有子节点
tag_soup = soup.find('div', class_='container').contents
print(type(tag_soup))
for t in tag_soup:
	if t != '\n':  # 去掉换行符
		print(t)

python beautifulsoup,python,python,beautifulsoup,开发语言

6.2 通过children获取目标节点的所有子节点
tag_soup = soup.find('div', class_='container').children
print(type(tag_soup))
for t in tag_soup:
	if t != '\n':  # 去掉换行符
		print(t)

python beautifulsoup,python,python,beautifulsoup,开发语言

6.3 通过descendants获取目标节点的所有子孙节点
tag_soup = soup.find('div', class_='container').descendants
print(type(tag_soup))
for t in tag_soup:
	if t != '\n':  # 去掉换行符
		print(t)

python beautifulsoup,python,python,beautifulsoup,开发语言文章来源地址https://www.toymoban.com/news/detail-786086.html

6.4 通过parents获取目标节点的所有祖先节点
tag_soup = soup.find('div', class_='container').parents
print(type(tag_soup))
for t in tag_soup:
	if t != '\n':  # 去掉换行符
		print(t)
6.5 获取目标节点相关联的其他节点
a_soup = soup.find('div', class_='container').a  # 获取div里面的第一个<a>标签

print(a_soup.parent)  # 获取<a>标签的父节点

print(a_soup.next_sibling)  # 获取<a>标签的下一个兄弟节点

print(a_soup.previous_sibling)  # 获取<a>标签的上一个兄弟节点

print(a_soup.next_siblings)  # 获取<a>标签下面的所有兄弟节点

print(a_soup.previous_siblings)  # 获取<a>标签上面的所有兄弟节点

七、css选择器

7.1 通过标签名查找
# 查找所有title标签
soup.select('title')

# 查找div下的所有input标签
soup.select('div input')

# 查找html节点下的head节点下的title标签
soup.select("html head title")
7.2 通过id查找
# 查找id为id_text的标签
soup.select("#id_text")

# 查找id为id_text1、id_text2的标签
soup.select("#id_text1, #id_text2")

# 查找id为id_text1的input标签
soup.select('input#id_text1')
7.3 通过类名查找
# 查找类名为nextpage的标签
soup.select(".nextpage")

# 查找类名为nextpage、active的标签
soup.select('.nextpage, .active')

# 查找类名为nextpage的a标签
soup.select('a.nextpage')
7.4 通过属性查找
# 选择有href属性的a标签
soup.select('a[href]')

# 选择href属性为index_2.html的a标签
soup.select('a[href="index_2.html"]')

# 选择href以index开头的a标签
soup.select('a[href^="index"]')

# 选择href以html结尾的a标签
soup.select('a[href$="html"]')

# 选择href属性包含index的a标签
soup.select('a[href*="index"]')
7.5 其他选择器
# 查找div标签下的a标签
soup.select("div > a")

# 父节点中的第3个a标签
soup.select("a:nth-of-type(3)")

# a标签之后的input标签(a和input有共同父节点)
soup.select("a~input")

到了这里,关于Python之BeautifulSoup库详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python爬虫实现(requests、BeautifulSoup和selenium)

    Python requests 是一个常用的 HTTP 请求库,可以方便地向网站发送 HTTP 请求,并获取响应结果。 下载requests库 pip install requests 实例: 属性和方法 属性或方法 说明 content 返回响应的内容,以字节为单位 headers 返回响应头,字典格式 json() 返回结果的 JSON 对象 request 返回请求此响应

    2024年02月07日
    浏览(51)
  • Python 爬虫:如何用 BeautifulSoup 爬取网页数据

    在网络时代,数据是最宝贵的资源之一。而爬虫技术就是一种获取数据的重要手段。Python 作为一门高效、易学、易用的编程语言,自然成为了爬虫技术的首选语言之一。而 BeautifulSoup 则是 Python 中最常用的爬虫库之一,它能够帮助我们快速、简单地解析 HTML 和 XML 文档,从而

    2024年02月04日
    浏览(65)
  • Python 网页解析中级篇:深入理解BeautifulSoup库

    在Python的网络爬虫中,BeautifulSoup库是一个重要的网页解析工具。在初级教程中,我们已经了解了BeautifulSoup库的基本使用方法。在本篇文章中,我们将深入学习BeautifulSoup库的进阶使用。 在使用 find 和 find_all 方法查找元素时,我们可以使用复杂的查找条件,例如我们可以查找

    2024年02月12日
    浏览(47)
  • Python beautifulsoup4解析 数据提取 基本使用

    Beautiful Soup是Python的一个网页解析库,处理快捷; 支持多种解析器,功能强大。教程细致讲解Beautiful Soup的深入使用、节点选择器、CSS选择器、Beautiful Soup4的方法选择器等重要知识点,是学好爬虫的基础课程。 提示:以下是本篇文章正文内容,下面案例可供参考 建议把代码复

    2023年04月08日
    浏览(44)
  • 【python】利用BeautifulSoup提取html中的标签、数据

            对于不熟悉HTML和正则表达式的人,可以用第三方模块包BeautifulSoup来提取HTML或XML中的数据。 使用解析器分析指定的网页源代码,得到源代码的结构模型 通过标签名进行定位 源代码中可能会有多个同名标签,通过标签名定位只能返回第一个标签: 通过标签属性定

    2024年02月09日
    浏览(40)
  • python晋江文学城数据分析(一)——爬虫(BeautifulSoup正则)

    学爬虫,拿平常看小说的绿色网站下手。 爬取的数据主要分为两部分,收藏榜的小说信息和小说详情页的部分数据。         通过点击榜单上侧选项(其实也可以用拼音猜一猜),观察url变化,寻找规律。如fw指代范围,fbsj指代发表时间,ycx指代原创性,以此类推。可以

    2024年02月08日
    浏览(46)
  • python3 爬虫相关学习7:初步摸索使用 BeautifulSoup

    目录 1 一个爬图片pic的代码的例子 1.1 学习的原文章 1.2 原始代码的问题总结 问题1 问题2 问题3 其他问题 1.3 原始代码 2  直接在cmd里 python运行报错 和 处理 2.1 运行报错 2.2 报错原因: 没有提前安装这个bs4  模块 2.3 如何提前知道我的python环境下有没有安装bs4 或其他模块呢

    2024年02月08日
    浏览(46)
  • Python爬虫学习笔记(六)————BeautifulSoup(bs4)解析

    目录 1.bs4基本简介 (1)BeautifulSoup简称 (2)什么是BeatifulSoup? (3)优缺点 2.bs4安装以及创建 (1)安装          (2)导入          (3)创建对象 3.节点定位 (1)根据标签名查找节点 (2)函数         ①find(返回一个对象)         ②find_all(返回一个列表

    2024年02月17日
    浏览(57)
  • Python爬虫——BeautifulSoup,获取HTML中文档,标签等内容

    将复杂的HTML文档转换成一个复杂的树形结构,每个结点都是一个Python对象,所有对象可以分为四种: Tag NavigableString BeautifulSoup Comment 首先要引入该函数,再打开相应的html文件读取其中的内容,在使用BeautiSoup对其进行解析,解析的时候要使用相应类型的解析器html.parser bs当中

    2024年02月06日
    浏览(53)
  • python3 爬虫相关学习9:BeautifulSoup 官方文档学习

    目录 1 BeautifulSoup 官方文档 2 用bs 和 requests 打开 本地html的区别:代码里的一段html内容 2.1 代码和运行结果 2.2 用beautiful 打开 本地 html 文件 2.2.1 本地html文件 2.2.2 soup1=BeautifulSoup(html1,\\\"lxml\\\") 2.3 用requests打开 本地 html 文件 2.3.1 本地html文件 2.3.2 print(html1) 3 用bs 和 requests 打开 本

    2024年02月08日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包