脚本宝典收集整理的这篇文章主要介绍了bs4模块和实际案例,脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
From bs4 import BeautifulSoup
自行构造一个网页数据
htML_doc = """
<html>
<head>
<tITle>The Dormouse's story</title>
</head>
<body>
<p class="title">
<b>The Dormouse's story</b>
</p>
<p class="story">Once upon a time there were three liTTLe sisters; and their names were
<a href="http://example.COM/elsie" class="sister" id="link1">Elsie</a>
<a href="http://example.com/lacie" class="sister" id="link2">Lacie</a>
<a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>
and they lived at the bottom of a well.</p>
<p class="story">...</p>
</body>
</html>
"""
soup=BeautifulSoup(html_doc, 'lxml')
PRint(soup.a)
从上往下第一个a标签 soup.标签名称
print(soup.p.text)
获取标签内部的文本 包含内部所有的后代标签文本
print(soup.a.attrs)
获取标签内部所以的属性 字典数据类型
print(soup.a.attrs.get('href'))
print(soup.a.get('href'))
获取标签内部指定的属性(可以简写 省略attrs参数)
print(soup.p.children)
获取标签内部所有的字标签(需要循环取值才可以拿到)
print(soup.p.contents)
获取标签内部所有的元素
print(soup.p.parent)
获取标签的父标签
print(soup.p.parents)
获取标签所有的祖先标签(所有长辈)
缺点:只能找到符合条件的第一条数据 返回的结果是一个标签对象
print(soup.find(name='a'))
查找指定标签名的标签 默认只能找到符合条件的第一个
print(soup.find(name='a',id='link2'))
查找具有某个特定属性的标签 默认只能找到符合条件的第一个
print(soup.find(name='p', class_='title'))
为了解决关键字class的冲突 会加上下划线区分 (其他关键字也是如此)
print(soup.find(name='p', attrs={'class': 'title'}))
为了解决关键字的冲突问题我们可以直接使用attrs参数 避免冲突
print(soup.find(name='a', attrs={'class': 'c1'}))
print(soup.find(attrs={'class': 'c1'}))
name参数不写表示查找所有符合后续条件的标签
优点:查找所有符合条件的标签 返回的结果是一个列表
print(soup.find_all('a'))
name字段可以省略 查找的结果是一个列表
find_all使用方式与find一致 只是查找结果数量不一样
需要使用css选择器 返回的结果是一个列表
<p></p>
<div>
<a></a>
<p>
<a></a>
</p>
<div><p></p></div>
</div>
<p></p>
<p></p>
1.标签选择器
直接书写标签的名字即可
2.id选择器
#d1 相当于写了 id='d1'
3.class选择器
.c1 相当于写了 class="c1"
4.儿子选择器(大于号)选择器可以混合使用
div>p 查找div标签内部所有的儿子p
5.后代选择器(空格) 选择器可以混合使用
div p 查找div标签内部所有的后代p
print(soup.select('.title')) # 查找class含有title的标签 print(soup.select('.sister span')) # 查看class含有sister标签内部所有的后代span print(soup.select('#link1')) # 查找id等于link1的标签 print(soup.select('#link1 span')) # 查找id等于link1标签内部所有的后代span print(soup.select('#list-2 .element')) # 查找id等于list-2标签内部所有class为element的标签 print(soup.select('#list-2')[0].select('.element')) # 可以一直select,但其实没必要,一条select就可以了
需求:获取红牛所有分公司详细数据(名称 地址 邮箱 电话)
1.查看数据的加载方式 得知是直接加载的
2.朝该网页发送请求获取页面数据之后进行筛选
import requests
from bs4 import BeautifulSoup
# 1.发送get请求获取页面内容
res = requests.get('http://www.redbull.com.cn/about/branch')
# 2.解析页面数据
soup = BeautifulSoup(res.text, 'lXMl')
# 3.研究标签特性 精确查找
# 分公司名称数据
h2_tag_list = soup.find_all('h2') # 查找到所有的h2标签对象
# for tag in h2_tag_list:
# print(tag.text)
# 使用列表生成式
title_list = [tag.text for tag in h2_tag_list]
# 分公司地址数据
p1_tag_list = soup.find_all(name='p', attrs={'class': 'mapIco'})
# for tag in p_tag_list:
# print(tag.text)
# 使用列表生成式
addr_list = [tag.text for tag in p1_tag_list]
# 分公司邮箱数据
p2_tag_list = soup.find_all(name='p', attrs={'class': 'mailIco'})
# for tag in p2_tag_list:
# print(tag.text)
email_list = [tag.text for tag in p2_tag_list]
# 分公司电话数据
P3_tag_list = soup.find_all(name='p', attrs={'class': 'telIco'})
# for tag in p3_tag_list:
# print(tag.text)
phone_list = [tag.text for tag in p3_tag_list]
for i in range(len(title_list)):
print("""
公司名称:%s
公司地址:%s
公司邮箱:%s
公司电话:%s
""" % (title_list[i], addr_list[i], email_list[i], phone_list[i]))
以上是脚本宝典为你收集整理的bs4模块和实际案例全部内容,希望文章能够帮你解决bs4模块和实际案例所遇到的问题。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。