数据解析-bs4
bs4非通用方法
代码说明
# 非通用方法:只能取一个值 四大对象 BeautifulSoup,Tag,NavigableString,Comment
# 转换类型 BeautifulSoup对象 'bs4.BeautifulSoup'
soup = BeautifulSoup(html_doc,'lxml') # 默认bs4调用lxml解析库,可主动设置bs4的解析库
# 解析使用 tag对象 'bs4.element.tag'
result = soup.a # 仅能获取第一个符合条件的标签
# 获取标签内容 NavigableString对象 'bs4.element.NavigableString'
result = soup.li.string # 获取li标签文本内容
result = soup.a['href'] # 获取a标签属性值
# 获取注释 Comment 'bs4.element.Comment'
result = soup.p.string # 获取p标签属性值
# 格式化输出 会补全缺失标签
result = soup.prettify()
简单说明
"""非通用方法只能取一个值"""
def day7_bs_dot():
html_doc = """
<html>
<head>
<title>The Dormouse's story</title>
</head>
<body>
<div class="menu-list">
<p class='next'><!--111111111133--></p>
<ul class="clearfix">
<li class="navitem-index current active"><a href="/999">首页</a></li>
<li ><a href="/guonei">国内</a></li>
<li ><a href="/guoji">国际</a></li>
<li ><a href="/mil">军事</a></li>
</ul>
</div>
</body>
"""
# 四大对象 BeautifulSoup,Tag,NavigableString,Comment
# 转换类型 BeautifulSoup对象 'bs4.BeautifulSoup'
soup = BeautifulSoup(html_doc,'lxml') # 默认bs4调用lxml解析库,可主动设置bs4的解析库
# 格式化输出 会补全缺失标签
result = soup.prettify()
# 解析使用 tag对象 'bs4.element.tag'
result = soup.head # 获取头部
result = soup.li # 获取li标签 ,仅能获取第一个符合条件的标签
# 获取内容 NavigableString对象 'bs4.element.NavigableString'
result = soup.li.string # 获取li标签文本内容
result = soup.a['href'] # 获取a标签属性值
# 获取注释 Comment 'bs4.element.Comment'
result = soup.p.string # 获取a标签属性值
print(result)
print(type(result))
bs4通用方法
代码说明
# find 方法 返回符合查询条件的第一个标签
result = soup.find(name='li', attrs={'class': 'active'})
# find_all 方法 返回包含标签对象的列表
result = soup.find_all('li', limit=1)[0]
# select_one CSS的选择器
result = soup.select_one('.active')
# select CSS的选择器
result = soup.select('.active') #类选择器
result = soup.select('#one') # id选择器
result = soup.select('ul li.active') #后代选择器
result = soup.select('title,.active') #组选择器
result = soup.select('li[class="active"]') #属性选择器
# 获取标签内容
result = soup.select('li')[0].get_text()
# 获取标签属性值
result = soup.select('a')[0].get('href')
简单使用
"""通用方法 爬虫常用"""
def day7_bs4_fun():
html_doc = """
<html>
<head>
<title>The Dormouse's story</title>
</head>
<body>
<div class="menu-list">
<p class='next'><!--111111111133--></p>
<ul class="clearfix">
<li id="one" class="active"><a href="/999">首页</a></li>
<li class="active"><a href="/guonei">国内</a></li>
<li ><a href="/guoji">国际</a></li>
<li ><a href="/mil">军事</a></li>
</ul>
</div>
</body>
"""
# 转换类型 BeautifulSoup对象 'bs4.BeautifulSoup'
soup = BeautifulSoup(html_doc, 'lxml') # 默认bs4调用lxml解析库,可主动设置bs4的解析库
# find 方法 返回符合查询条件的第一个标签
result = soup.find(name='p') # 获取p标签
result = soup.find(attrs={'class': 'active'}) # 获取a标签属性值
result = soup.find(text='军事') # 获取标签内容
result = soup.find(name='li', attrs={'class': 'active'})
# find_all 方法 返回包含标签对象的列表
result = soup.find_all('li')
result = soup.find_all('li', limit=1)[0] # 此为find源码
result = soup.find_all(attrs={'class': 'active'})
# select_one CSS的选择器
result = soup.select_one('.active')
# select CSS的选择器
result = soup.select('.active') #类选择器
result = soup.select('#one') # id选择器
result = soup.select('ul li.active') #后代选择器
result = soup.select('title,.active') #组选择器
result = soup.select('li[class="active"]') #属性选择器
# 获取标签内容
result = soup.select('li')[0].get_text()
# 获取标签属性
result = soup.select('a')[0].get('href')
print(result)
bs4实例
爬取****小说名,url,文案并保存为json
# 爬取**** 小说名,url,文案并保存为json
class Day7Bs4Btc(object):
def __init__(self):
self.base_url = 'https://www.****.com/forum.php?mod=forumdisplay&fid=41&page={}'
self.headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:106.0) Gecko/20100101 Firefox/106.0',
}
self.data_list = []
self.detail_data_list = []
def get_response(self, url):
response = requests.get(url,headers=self.headers)
data = response.content.decode()
return data
def parse_list_data(self,data,rule):
"""保存当前小说的url"""
# 转类型
soup = BeautifulSoup(data,'lxml')
# 根据bs4解析
# a_list = soup.select('#threadlisttableid')[0].select('.xst')
a_list = soup.select('.xst')
for item in a_list:
title = item.get_text()
url = 'https://www.***.com/' + str(item.get('href'))
self.data_list.append({'title':title, 'url':url})
# print(self.data_list)
def parse_detail_data(self,title,url, data):
"""解析详情页的数据"""
# 转类型
soup = BeautifulSoup(data, 'lxml')
# 根据bs4解析 获取文案
detail = soup.select('.t_f')[0].get_text()
self.detail_data_list.append({'title': title, 'url': url,'detail': detail})
def save_data(self,data,file_path):
# 将列表转为字符串
data_str = json.dumps(data)
with open(file_path, 'w', encoding='utf-8') as f:
f.write(data_str)
def start(self):
# 拼接完整URL
for i in range(1,6):
#列表页请求
url = self.base_url.format(i)
# 发送请求
data = self.get_response(url)
# 做解析
self.parse_list_data(data, 1)
# 保存
self.save_data(self.data_list, 'baidu.json')
#发送详情页请求
for data in self.data_list[4:]:
detail_url = data['url']
detail_title = data['title']
detail_data = self.get_response(detail_url)
#解析详情页数据
self.parse_detail_data(detail_title,detail_url,detail_data)
self.save_data(self.detail_data_list, 'detail.json')