Python BeautifulSoup 库
一、BeautifulSoup 库概述
什么是 BeautifulSoup?
- BeautifulSoup 是一个Python库,用于从 HTML 提取数据。
- 它提供了简单而灵活的方式来遍历和搜索文档树,以及解析和提取所需的数据。
安装 BeautifulSoup 库
- 在 Python 中,可以使用 pip 命令来安装 BeautifulSoup 库:
pip install beautifulsoup4
二、 使用 BeautifulSoup 库解析 HTML 文档
导入库
from bs4 import BeautifulSoup
解析 HTML 文档
# 从文件中解析 HTML 文档
with open('example.html') as file:
soup = BeautifulSoup(file, 'lxml')
# 从字符串中解析 HTML 文档
html = '<html><body><h1>Hello, World!</h1></body></html>'
soup = BeautifulSoup(html, 'lxml')
获取标签对象:
对象.标签名 如果标签名有多个,只会拿到第一个
对象.find(标签名) 如果标签名有多个,只会拿到第一个
对象.find(标签名,属性名=属性值) 找标签名并且属性名=属性值的标签,如果有多个,只会拿第一个
对象.findAll(标签名) 返回列表,如果标签名有多个,全部在列表中
对象.findAll(标签名,属性名=属性值) 如果是class属性 class_=属性值
对象.select(选择器) 返回列表,如果标签名有多个,全部在列表中
对象.select("#id属性值")
对象.select(".class属性值")
对象.select("标签名")
对象.select("标签名1>标签名2") 匹配标签名1的儿子标签2
对象.select("标签名1 标签名2") 匹配标签名1的后代标签2
对象.string 如果标签内还包含子标签,拿不到该标签的文本,只有一个文本内容
<div class="footer-box1">
ciicicici
</div>
对象.text
<div class="footer-box1">
ciicicici
<div>avbcchjdjahuisd</div>
</div>
获取属性值:
对象[属性名]
使用方式
'''
作用:提取目标数据
beautifulSoup4 从 html 或者 xml 文件中提取数据
pip install beautifulSoup4
pip install lxml
配合 lxml
1.通过 beautifulSoup 对象,把带解析的页面源码数据加载到该对象中
2.调用方法进行定位来提取数据
1-本地 html 中
BeautifulSoup(本地的html文件对象,解析器的名字)
2-网页源码数据
'''
# with open() as f: 自动关闭文件
# f = open() # 手动关闭文件
from bs4 import BeautifulSoup
f = open('test.html','r',encoding='utf-8')
s = BeautifulSoup(f,'lxml') # 创建 BeautifulSoup 对象,把对象交给 s 变量保存
# print(s) # BeautifulSoup 对象
#
# print(s.title) # 定位标签:对象.标签名
# print(s.link) # 如果标签有多个,只会获取到第一个
# 对象.find(标签名,属性名=属性值)
# print(s.find('p',id=111))
# 如果属性名为class,class_
# 如果页面中有多个div标签,并且class属性值是一样的,只会获取到第一个
# print(s.find('div',class_='footer-content'))
# print(s.find('meta',charset='utf-8'))
# print(s.findAll('meta', charset='utf-8'))
# print(s.findAll('div', class_='footer-content'))
# print(s.findAll('link'))
# find:返回满足条件的第一个
# findAll:返回满足条件的所有(列表)
'''
<p id=1>1</p>
<p>2</p>
<p>3</p>
'''
# 选择器查找
# 标签名选择器 id选择器 #id值
# class选择器 .class值
# print(s.select('#abc'))
# print(s.select('.footer-content'))
# 子类选择器 后代选择器
# print(s.select('#aaa>a>b'))
# 后代选择器(儿子,孙子....) 空格隔开
# print(s.select('link b'))
# 获取标签内的内容
# print(s.select('#abc')[0].string) # select返回的是列表
# print(s.find('a',id='abc').string) # find只返回一个对象
#
# print(s.find('a',id='abc').text)
# string:改标签的文本内容
# print(s.find('div',class_='footer-box').string)
# print('----------------------')
# text:该标签下的所有文本内容
# print(s.find('div',class_='footer-box').text)
# 一旦标签中还有子标签,当前这个标签的内容,用string获取不到
# print(s.find('div',class_='footer-box1').string)
# # 拿到该标签下所有的文本内容
# print(s.find('div',class_='footer-box1').text)
# print(s.select('#abc')[0]['href'])
# print(s.find('a',id="abc")['href'])
f.close()
import os
from bs4 import BeautifulSoup
# 爬取到的数据写入到雪中悍刀行的文件夹中,如果文件夹不存在,希望自动创建
# os.path.exists('雪中悍刀行') # 当前这个文件夹是否存在,如果存在,为 True,如果不存在为 False
if not os.path.exists('雪中悍刀行'):
# 如果文件夹不存在,则进入if执行代码,自动创建文件夹
os.mkdir('雪中悍刀行')
url = 'https://www.junjh.com/xiaoshuo/26/26399/'
import requests
res = requests.get(url)
s = BeautifulSoup(res.text,'lxml')
# 获取列表页的所有 a 标签
a_lis = s.select('.mulu_list>li>a')
count = 1
# 循环列表,取出每一个 a 标签
for i in a_lis:
# print(i)
# 获取 href 属性值
# 获取 title 属性值
# 获取第一章 url 和标题
# print(i['href'],i['title'])
# 拼接完整 url
# https://www.junjh.com/xiaoshuo/26/26399/13018634.html
# href = 'https://www.junjh.com'+i['href'] # https://www.junjh.com/xiaoshuo/26/26399/13018634.html
href = f'https://www.junjh.com{i["href"]}'
# 重新发起请求,请求章节 url
response = requests.get(href)
page_text = response.text# 每一个章节的 html 源码数据
# 对数据进行提取,创建对象解析的页面为小说页面数据
ss = BeautifulSoup(page_text, 'lxml')
# 小说数据在div id=htmlContent下的p标签内
text = ss.select('#htmlContent>p')[0].text
# print(text)
# 保存到文件中
with open(f'雪中悍刀行/{count}.txt','a',encoding='utf-8')as f:
f.write(text)
count += 1
if count == 11:
break
'''
1-获取小说的详情页(每个章节描述)
2-解析章节 url
3-对章节url发起请求,获取章节页面数据
4-对数据进行解析,只需要拿小说数据
5-保存数据到文件中
'''
总结
- BeautifulSoup 是一个强大的 Python 库,用于解析 HTML 或 XML 文档,并提供了简单而灵活的方式来提取所需的数据。
- 通过导入 BeautifulSoup 库,并使用其提供的方法,可以方便地解析文档、搜索元素,并提取文本内容和属性值。