欢迎关注 『python爬虫』 专栏,持续更新中
欢迎关注 『python爬虫』 专栏,持续更新中

安装 Beautiful Soup

pip install beautifulsoup4
pip install beautifulsoup

安装解析器

标准化,默认安装beautifulsoup后自带的html.parser

兼容性好
pip install lxml
纯Python实现的 html5lib , html5lib的解析方式与浏览器相同
pip install html5lib

方法介绍

BeautifulSoup

BeautifulSoup 的构造函数接受四个参数:

  • markup:这是要解析的HTML或XML文档的内容,可以是一个字符串或一个文件句柄(File-like object),也可以是一个表示文档内容的类似于 bytes 对象的对象。如果 markup 参数是字符串,那么需要指定第四个参数 features 来选择解析器。

  • features:这个参数用于选择解析器,可以是以下值之一:

“html.parser”:Python 的内置解析器,速度适中,依赖于 Python 库,无需额外安装。
“lxml”:使用 lxml 库作为解析器,速度较快,通常需要额外安装。
“xml”:解析XML文档时使用。
“html5lib”:使用 html5lib 库作为解析器,解析速度较慢,但能够处理不规范的HTML文档。
默认值为 “html.parser”。

  • builder:这个参数用于选择文档树的构建器,可以是以下值之一:

None:默认值,根据解析器选择合适的构建器。
“html5lib”:使用 html5lib 构建器构建文档树。
“lxml”:使用 lxml 构建器构建文档树。

  • parse_only:这个参数用于指定解析器只解析文档中的特定部分,可以是以下值之一:

一个函数,该函数接受一个标签作为参数,并返回一个布尔值,用于判断是否解析该标签以及其子孙标签。
一个标签名称的列表,只解析这些标签及其子孙标签。
一个 CSS 选择器字符串,只解析符合该选择器的标签及其子孙标签。

import requests

html_doc = """
<html><head><title class="story_start"><p>标题1</p></title></head>
<body>
<p class="title"><b>故事名</b></p>

<p class="story">东汉末年,桃园结义</p>
<a href="http://example.com/elsie" class="zhangfei" id="zhangfei_id">张飞</a>,
<a href="http://example.com/lacie" class="guanyu" id="guanyu_id">关羽</a> and
<a href="http://example.com/tillie" class="liubei" id="liubei_id">刘备</a>;
<p>第一回</p>;


<p class="story_end">
div标签内容(爷爷)
    <p>
        p子标签内容(爸爸)
        <p>
            p子标签的子标签内容(儿子)
        </p>
    </p>
    <p>p子标签内容(妈妈)</p>
</p>

"""

from bs4 import BeautifulSoup

# url="https://blog.csdn.net/u011027547"
# r=requests.get(url)
# print(r.text)

soup = BeautifulSoup(html_doc, 'html.parser')

获取美化后的网页信息

#获取美化后的网页信息
print(soup.prettify())

标签选择器

通过.标签类型只能拿到第一个标签,.attrs得到的是字典

print(".attrs拿到属性字典,可以指定具体的属性",soup.a.attrs,soup.a.attrs['href'])

print(".string拿到文本",soup.p,soup.p.string)#注意string的大小写!!!

.find

找到符合条件的第一个

print(".find默认找到第一个",soup.find("a"))

print(".find 指定id",soup.find("a",id="guanyu_id"))

print(".find 指定class_ 注意因为关键字冲突,class后要加一个_",soup.find("a",class_="liubei"))

.findAll

找到符合条件的所有dom 返回列表

print(".findAll 多个标签返回列表 注意因为关键字冲突,",soup.findAll("a"))

print(".findAll 指定多种标签",soup.findAll(["a","p"]))#获取多个dom

print(".findAll limit限制最大数量",soup.findAll("a",limit=2))

select标签

返回的是一个列表,可以通过css的选择器形式选择标签

print(".select p",soup.select("p"))
print(".select .guanyu",soup.select(".guanyu"))
print(".select #liubei_id",soup.select("#liubei_id"))

属性选择器

.select(“标签名[属性名]”))
.select(“标签名[属性名=属性值]”))

print(".select 查找有id属性的a标签",soup.select("a[id]"))
print(".select 查找有id属性的a标签",soup.select("a[id=zhangfei_id]"))

层级选择器

用空格表示父子节点之间

print(".select 寻找有一个子标签p的p标签",soup.select("p p"))
print(".select 寻找有一个子标签p的p标签,3层p标签",soup.select("p p p"))

获取节点文本信息

关于这下面三种的区别,详见
『python爬虫』beautifulsoup库获取文本的方法.get_text()、.text 和 .string区别(保姆级图文)
省流的话推荐用get_text()

obj=soup.select(".story_end")[0]
print(".string 有标签也有子标签,返回none",obj.string)
print(".text",obj.text)
print(".get_text",obj.get_text(separator=' ', strip=True))
  • string的补充说明
obj=soup.select(".story_start")[0]
print(".string 如果只有标签也可以获取得到子标签的文本,即便子标签内没有文本",obj.string)

节点属性获取

obj=soup.select(".zhangfei")[0]
print(".name 获取标签名 a",obj.name)
print(".attrs 获取标签属性 ",obj.attrs)
print(".attrs 获取标签指定属性的两种写法 ",obj.attrs["id"],obj["href"])

示例代码

在这里插入图片描述

import requests

html_doc = """
<html><head><title class="story_start"><p>标题1</p></title></head>
<body>
<p class="title"><b>故事名</b></p>

<p class="story">东汉末年,桃园结义</p>
<a href="http://example.com/elsie" class="zhangfei" id="zhangfei_id">张飞</a>,
<a href="http://example.com/lacie" class="guanyu" id="guanyu_id">关羽</a> and
<a href="http://example.com/tillie" class="liubei" id="liubei_id">刘备</a>;
<p>第一回</p>;


<p class="story_end">
div标签内容(爷爷)
    <p>
        p子标签内容(爸爸)
        <p>
            p子标签的子标签内容(儿子)
        </p>
    </p>
    <p>p子标签内容(妈妈)</p>
</p>

"""

from bs4 import BeautifulSoup

# url="https://blog.csdn.net/u011027547"
# r=requests.get(url)
# print(r.text)

soup = BeautifulSoup(html_doc, 'html.parser')

#获取美化后的网页信息
print(soup.prettify())

#标签选择器 拿到第一个
print(".attrs拿到属性字典,可以指定具体的属性",soup.a.attrs,soup.a.attrs['href'])

print(".string拿到文本",soup.p,soup.p.string)#注意string的大小写!!!

#.find 找到符合条件的第一个
print(".find默认找到第一个",soup.find("a"))

print(".find 指定id",soup.find("a",id="guanyu_id"))

print(".find 指定class_ 注意因为关键字冲突,class后要加一个_",soup.find("a",class_="liubei"))

#.findAll 找到符合条件的所有dom 返回列表
print(".findAll 多个标签返回列表 注意因为关键字冲突,",soup.findAll("a"))

print(".findAll 指定多种标签",soup.findAll(["a","p"]))#获取多个dom

print(".findAll limit限制最大数量",soup.findAll("a",limit=2))

# select方法,返回的是一个列表
print(".select p",soup.select("p"))
print(".select .guanyu",soup.select(".guanyu"))
print(".select #liubei_id",soup.select("#liubei_id"))

#属性选择器
print(".select 查找有id属性的a标签",soup.select("a[id]"))
print(".select 查找有id属性的a标签",soup.select("a[id=zhangfei_id]"))

#层级选择器
print(".select 寻找有一个子标签p的p标签",soup.select("p p"))
print(".select 寻找有一个子标签p的p标签,3层p标签",soup.select("p p p"))

#获取节点信息  在html.parser模式下
obj=soup.select(".story_end")[0]
print(".string 有标签也有子标签,返回none",obj.string)
print(".text",obj.text)
print(".get_text",obj.get_text(separator=' ', strip=True))

# .string的补充说明
obj=soup.select(".story_start")[0]
print(".string 如果只有标签也可以获取得到子标签的文本,即便子标签内没有文本",obj.string)


#节点信息获取
obj=soup.select(".zhangfei")[0]
print(".name 获取标签名 a",obj.name)
print(".attrs 获取标签属性 ",obj.attrs)
print(".attrs 获取标签指定属性的两种写法 ",obj.attrs["id"],obj["href"])


总结

大家喜欢的话,给个👍,点个关注!给大家分享更多计算机专业学生的求学之路!

版权声明:

发现你走远了@mzh原创作品,转载必须标注原文链接

Copyright 2023 mzh

Crated:2023-3-1

欢迎关注 『python爬虫』 专栏,持续更新中
欢迎关注 『python爬虫』 专栏,持续更新中
『未完待续』


Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐