模块安装
pip3 install beautifulsoup4
模块导入
from bs4 import BeautifulSoup
示例html内容
获取html内容代码
import requests
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36 115Browser/9.0.0"
}
response = requests.get("https://www.xbiquge6.com/xbqgph.html",headers=headers)
response.encoding = "utf-8"
html = response.text
print(html)
获取的html内容
经典小说排行榜-新笔趣阁
构建BeautifulSoup对象
常用四种解释器
解释器 |
标识 |
特点 |
Python标准库 |
html.parser |
Python内置,执行速度中 |
lxml的HTML解释器 |
lxml |
速度快 |
lxml的XML解释器 |
xml |
唯一支持XML解析 |
html5lib |
html5lib |
容错性最好,以浏览器方式解析 |
soup = BeautifulSoup(html, 'html.parser')
还可以解析本地html文件
soup1 = BeautifulSoup(open('index.html'))
.prettify()格式化输出节点
略
通过 . 获取节点
title = soup.head.title
print(type(title))
print(title)
结果是
经典小说排行榜-新笔趣阁
对于名称唯一的节点,可以省略层级
title = soup.title
print(type(title))
print(title)
结果同样是
经典小说排行榜-新笔趣阁
名称不唯一的节点,直接获取只会获取第一个匹配的节点
li = soup.li
print(li)
结果是
首页
find_all根据条件获取节点
find_all( name , attrs , recursive , text , **kwargs )
name :查找所有名字为 name 的tag,字符串对象会被自动忽略掉;
attrs:根据属性查询,使用字典类型;
text :可以搜搜文档中的字符串内容.与 name 参数的可选值一样, text 参数接受 字符串 , 正则表达式 , 列表, True ;
recursive:调用tag的 find_all() 方法时,Beautiful Soup会检索当前tag的所有子孙节点,如果只想搜索tag的直接子节点,可以使用参数 recursive=False ;
limit:find_all() 方法返回全部的搜索结构,如果文档树很大那么搜索会很慢.如果我们不需要全部结果,可以使用 limit 参数限制返回结果的数量.效果与SQL中的limit关键字类似,当搜索到的结果数量达到 limit 的限制时,就停止搜索返回结果;
class_ :通过 class_ 参数搜索有指定CSS类名的tag,class_ 参数同样接受不同类型的 过滤器 ,字符串,正则表达式,方法或 True。
根据标签名字
lis = soup.find_all(name="li")
for item in lis:
print(item)
结果是
首页
永久书架
玄幻奇幻
武侠仙侠
都市言情
历史军事
科幻灵异
网游竞技
女频频道
完本小说
排行榜单
临时书架
作品分类作品名称最新章节作者更新时间状态
[都市言情]我能举报万物第九十六章 巡抚视察【第三更】必火2019-11-16连载中
[科幻灵异]女战神的黑包群第3046章 恶毒女配,在线提刀45二谦2019-11-16连载中
[玄幻奇幻]花岗岩之怒第一百五十二章 意外到来的断剑咱的小刀2019-11-16连载中
[网游竞技]超神机械师1090 韭菜的自觉齐佩甲2019-11-16连载中
[武侠仙侠]无量真途第六百三十二章 突然出现的神智燕十千2019-11-16连载中
[科幻灵异]我的细胞监狱第四百五十九章 白雾穿黄衣的阿肥2019-11-16连载中
[武侠仙侠]前任无双第三百章 事急速办跃千愁2019-11-16连载中
[武侠仙侠]元阳道君第四十章 洞开剑扼虚空2019-11-16连载中
[历史军事]逆成长巨星655:不是办法的办法葛洛夫街兄弟2019-11-16连载中
[历史军事]承包大明第一百九十三章 真会玩南希北庆2019-11-16连载中
根据标签属性
属性和值以字典形式传入
lis = soup.find_all(attrs={"class":"s2"})
for item in lis:
print(item)
结果是
作品名称
我能举报万物
女战神的黑包群
花岗岩之怒
超神机械师
无量真途
我的细胞监狱
前任无双
元阳道君
逆成长巨星
承包大明
限制搜索范围
find_all 方法会搜索当前标签的所有子孙节点,如果只想搜索直接子节点,可以使用参数 recursive=False
遍历获取子节点
.contents获取所有子节点
以列表形式返回所有子节点,要注意,列表里面还会掺杂 'n'
ul = soup.ul
print(ul)
print(ul.contents)
结果是
['\n', 首页, '\n', 永久书架, '\n', 玄幻奇幻, '\n', 武侠仙侠, '\n', 都市言情, '\n', 历史军事, '\n', 科幻灵异, '\n', 网游竞技, '\n', 女频频道, '\n', 完本小说, '\n', 排行榜单, '\n', 临时书架, '\n']
.children获取所有子节点
返回一个list生成器对象
ul = soup.ul
print(ul.children)
print(list(ul.children))
结果是
['\n', 首页, '\n', 永久书架, '\n', 玄幻奇幻, '\n', 武侠仙侠, '\n', 都市言情, '\n', 历史军事, '\n', 科幻灵异, '\n', 网游竞技, '\n', 女频频道, '\n', 完本小说, '\n', 排行榜单, '\n', 临时书架, '\n']
.descendants遍历所有子孙节点
ul = soup.ul
for item in ul.descendants:
print(item)
结果是(中间很多'\n'空行我删掉了)
首页
首页
首页
永久书架
永久书架
永久书架
玄幻奇幻
玄幻奇幻
玄幻奇幻
武侠仙侠
武侠仙侠
武侠仙侠
都市言情
都市言情
都市言情
历史军事
历史军事
历史军事
科幻灵异
科幻灵异
科幻灵异
网游竞技
网游竞技
网游竞技
女频频道
女频频道
女频频道
完本小说
完本小说
完本小说
排行榜单
排行榜单
排行榜单
临时书架
临时书架
临时书架
获取其父节点
a = soup.li.a
print(a)
p = a.parent
print(p)
结果是
首页
首页
提取节点信息
节点名称
感觉没什么用
title = soup.title
print(title.name)
结果是
title
节点属性
a = soup.li.a
print(a)
print(a.attrs) # 获取所有属性,返回字典形式
print(a['href'])# 获取a节点的href属性值
结果是
首页
{'href': '/'}
/
节点文本
a = soup.li.a
print(type(a.string)) # 节点内文本的类型
print(a.string) # 获取节点内的文本内容
print(a.get_text()) # 也是获取节点内的文本内容
结果是
首页
注意!!!如果节点内文本是注释,则用string取出文本时会自动去除注释标记注释的类型: ,可以通过类型判断
遍历获取所有子孙节点中的文本
for string in soup.stripped_strings: # 去除多余空白内容
print(repr(string))
想进一步了解编程开发相关知识,与我一同成长进步,请关注我的公众号“松果仓库”,共同分享宅&程序员的各类资源,谢谢!!!