bs4模块和实际案例

发布时间:2022-07-05 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了bs4模块和实际案例脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

bs4模块的基本使用

From bs4 import  BeautifulSoup

 

bs4模块和实际案例

 

 

自行构造一个网页数据

bs4模块和实际案例

bs4模块和实际案例

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>
"""
View Code

 

1.构造一个bs4解析器对象

soup=BeautifulSoup(html_doc, 'lxml')

 

2.利用对象的内置方法完成筛选数据的操作

PRint(soup.a)

从上往下第一个a标签  soup.标签名称

bs4模块和实际案例

 

 

print(soup.p.text)

获取标签内部的文本 包含内部所有的后代标签文本

bs4模块和实际案例

 

 

print(soup.a.attrs)

获取标签内部所以的属性 字典数据类型

bs4模块和实际案例

 

 

print(soup.a.attrs.get('href'))
print(soup.a.get('href'))

获取标签内部指定的属性(可以简写 省略attrs参数)

bs4模块和实际案例

 

 

print(soup.p.children)

获取标签内部所有的字标签(需要循环取值才可以拿到)

bs4模块和实际案例

 

 

print(soup.p.contents)

获取标签内部所有的元素

bs4模块和实际案例

 

 

print(soup.p.parent)

获取标签的父标签

 

print(soup.p.parents)

获取标签所有的祖先标签(所有长辈)

 

bs4模块的核心操作

1.find方法  

缺点:只能找到符合条件的第一条数据 返回的结果是一个标签对象

 

print(soup.find(name='a'))

查找指定标签名的标签 默认只能找到符合条件的第一个

bs4模块和实际案例

 

 

print(soup.find(name='a',id='link2'))

查找具有某个特定属性的标签 默认只能找到符合条件的第一个

bs4模块和实际案例

 

 

print(soup.find(name='p', class_='title')) 

了解决关键字class的冲突 会加上下划线区分 (其他关键字也是如此)

bs4模块和实际案例

 

 

print(soup.find(name='p', attrs={'class': 'title'}))

为了解决关键字的冲突问题我们可以直接使用attrs参数 避免冲突

print(soup.find(name='a', attrs={'class': 'c1'})) 

class属性查找属于成员运算 有就行

print(soup.find(attrs={'class': 'c1'}))

name参数不写表示查找所有符合后续条件的标签

 

bs4模块和实际案例

 

 

2.find_all方法

优点:查找所有符合条件的标签 返回的结果是一个列表

 

print(soup.find_all('a'))

name字段可以省略 查找的结果是一个列表

find_all使用方式与find一致 只是查找结果数量不一样

 

3.select方法

需要使用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,请注明来意。