『python爬虫』beautifulsoup基本用法(保姆级图文)
『python爬虫』beautifulsoup基本用法(保姆级图文)
目录
欢迎关注 『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爬虫』 专栏,持续更新中
『未完待续』
更多推荐
所有评论(0)