bs4 的使用方法

#!/usr/bin/env python
# -*- coding: utf-8 -*-

# bs4 是三方库,在调用的时候,要先在cmd中下载 pip install bs4
import bs4
from bs4 import BeautifulSoup

content = '''<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>soup测试</title>
    <title class="warm">你那温情的一笑,搞得我瑟瑟发抖</title>
</head>
<body>
<div class="tang">
    <ul>
        <li class="hello" id="world"><a href="http://www.baidu.com" title="出塞"><!--秦时明月汉时关,万里长征人未还,但使龙城飞将在,不教胡马度阴山--></a></li>
        <list><a href="https://www.baidu.com" title="出塞" style="font-weight: bold"><!--秦时明月汉时关,万里长征人未还,但使龙城飞将在,不教胡马度阴山--></a></list>
        <li><a href="http://www.163.com" class="taohua" title="huahua">人面不知何处去,桃花依旧笑春风</a></li>
        <lists class="hello"><a href="http://mi.com" id="hong" title="huahua">去年今日此门中,人面桃花相映红</a></lists>
        <li id="wo"><a href="http://qq.com" name="he" id="gu">故人西辞黄鹤楼,烟花三月下扬州</a></li>
    </ul>
    <ul>
        <li class="hello" id="sf"><a href="http://www.baidu.com" title="出塞"><!--秦时明月汉时关,万里长征人未还,但使龙城飞将在,不教胡马度阴山--></a></li>
        <list><a href="https://www.baidu.com" title="出塞"><!--秦时明月汉时关,万里长征人未还,但使龙城飞将在,不教胡马度阴山--></a></list>
        <li><a href="http://www.163.com" class="taohua">人面不知何处去,桃花依旧笑春风</a></li>
        <lists class="hello"><a href="http://mi.com" id="fhsf">去年今日此门中,人面桃花相映红,不知桃花何处去,出门依旧笑楚风</a></lists>
        <li id="fs"><a href="http://qq.com" name="he" id="gufds">故人西辞黄鹤楼,烟花三月下扬州</a></li>
    </ul>
</div>
<div id="meng">
    <p class="jiang">
        <span>三国猛将</span>
    <ol>
        <li>关羽</li>
        <li>张飞</li>
        <li>赵云</li>
        <li>马超</li>
        <li>黄忠</li>
    </ol>
    <div class="cao">
        <ul>
            <li>典韦</li>
            <li>许褚</li>
            <li>张辽</li>
            <li>张郃</li>
            <li>于禁</li>
            <li>夏侯惇</li>
        </ul>
    </div>
    </p>
</div>
</body>
</html>'''


# 使用bs4推荐的解析方式:lxml (如果初次使用,需要在终端安装: pip install lxml
soup = BeautifulSoup(content, 'lxml')  # str 数据转换成soup对象, 对象是一个文档内容
# print(soup)
# print(type(soup))  # <class 'bs4.BeautifulSoup'>

# Tag 通俗的将就是HTML中的一个个标签
ret = soup.title   # 使用.只能匹配获取第一个
# print(ret)  # <title>soup测试</title>
# print(type(ret))  #  <class 'bs4.element.Tag'>


# NavigableSrting:既然我们已经得到了标签,那么问题来了,我们想要获取标签内部的文字怎么办呢?
# 很简单,用.string 即可
ret = soup.title.string
# print(ret)  # soup测试
# print(type(ret))  # <class 'bs4.element.NavigableString'>


# Comment:对象是一个特殊类型的NavigableString对象,其输出的内容不包括注释符号
# <!--xxxxx--> comment 注释
# <class 'bs4.element.Comment'>
ret = soup.li.string
# print(ret)   # 秦时明月汉时关,万里长征人未还,但使龙城飞将在,不教胡马度阴山
# print(type(ret))  # <class 'bs4.element.Comment'>


# 获取属性的值 !!!
li = soup.li
# 方法一:
ret = li.get('class')   # 如果没有获取到改属性,也不会报错,返回一个None
# print(ret)  # ['hello']

# 方法二:
ret = li['class']
# print(ret)  # ['hello']

# 方法三:
ret = li.attrs['id']
# print(ret)  # world



# 可以使用遍历来取出我们想要的数据
ret = soup.contents  # 以一个列表的形式,将真个页面里的标签返回
ret = soup.ul.contents
# print(ret)
# print(len(ret))
# for data in ret:
#     if data != '\n':
#         # print(data)
#         # print(data.string)
#         try:
#             print(data['id'])
#         except:
#             pass

'''
<li class="hello" id="world"><a href="http://www.baidu.com" title="出塞"><!--秦时明月汉时关,万里长征人未还,但使龙城飞将在,不教胡马度阴山--></a></li>
<list><a href="https://www.baidu.com" style="font-weight: bold" title="出塞"><!--秦时明月汉时关,万里长征人未还,但使龙城飞将在,不教胡马度阴山--></a></list>
<li><a class="taohua" href="http://www.163.com" title="huahua">人面不知何处去,桃花依旧笑春风</a></li>
<lists class="hello"><a href="http://mi.com" id="hong" title="huahua">去年今日此门中,人面桃花相映红</a></lists>
<li id="wo"><a href="http://qq.com" id="gu" name="he">故人西辞黄鹤楼,烟花三月下扬州</a></li>
秦时明月汉时关,万里长征人未还,但使龙城飞将在,不教胡马度阴山
秦时明月汉时关,万里长征人未还,但使龙城飞将在,不教胡马度阴山
人面不知何处去,桃花依旧笑春风
去年今日此门中,人面桃花相映红
故人西辞黄鹤楼,烟花三月下扬州
world
wo
'''


# 返回一个迭代器
ret = soup.ul.children
# print(ret)
# for data in ret:
#     if data != '\n':
#         print(data)

'''
<list_iterator object at 0x104f75208>
<li class="hello" id="world"><a href="http://www.baidu.com" title="出塞"><!--秦时明月汉时关,万里长征人未还,但使龙城飞将在,不教胡马度阴山--></a></li>
<list><a href="https://www.baidu.com" style="font-weight: bold" title="出塞"><!--秦时明月汉时关,万里长征人未还,但使龙城飞将在,不教胡马度阴山--></a></list>
<li><a class="taohua" href="http://www.163.com" title="huahua">人面不知何处去,桃花依旧笑春风</a></li>
<lists class="hello"><a href="http://mi.com" id="hong" title="huahua">去年今日此门中,人面桃花相映红</a></lists>
<li id="wo"><a href="http://qq.com" id="gu" name="he">故人西辞黄鹤楼,烟花三月下扬州</a></li>

'''

# 返回的也是一个迭代器
ret = soup.ul.descendants
# print(ret)  # <generator object descendants at 0x1045e7570>
#
# for data in ret:
#     if data != '\n':
#         print(data)
#



# 搜索功能
#            find 方法
# 方法一:
ret = soup.find(name='li', attrs={'id':'wo'})
# print(ret)
# <li id="wo"><a href="http://qq.com" id="gu" name="he">故人西辞黄鹤楼,烟花三月下扬州</a></li>

# 方法二:
ret = soup.find(name='li', id='wo')
# print(ret)
# <li id="wo"><a href="http://qq.com" id="gu" name="he">故人西辞黄鹤楼,烟花三月下扬州</a></li>

# class 是关键字,加一个下划线就可以了
ret = soup.find(name='lists', class_='hello')
# print(ret)
# <lists class="hello"><a href="http://mi.com" id="hong" title="huahua">去年今日此门中,人面桃花相映红</a></lists>


# 方法三:
ret = soup.find(name='lists', attrs={'class': 'hello'})
# print(ret)
# <lists class="hello"><a href="http://mi.com" id="hong" title="huahua">去年今日此门中,人面桃花相映红</a></lists>


#            find_all 方法  : 找到的是所有的匹配元素
ret = soup.find_all(name='lists', attrs={'class': 'hello'})
print(ret)
# [<lists class="hello"><a href="http://mi.com" id="hong" title="huahua">去年今日此门中,人面桃花相映红</a></lists>, <lists class="hello"><a href="http://mi.com" id="fhsf">去年今日此门中,人面桃花相映红,不知桃花何处去,出门依旧笑楚风</a></lists>]



# limit=5  限制条件,获取前5条数据
ret = soup.find_all(name='li',limit=5)
# print(len(ret))



####  soup.select()  返回类型是list
##
# . 表示类名,# 表示id
ret = soup.select('li#world')   # li标签下  ID 为 : world
# print(ret)
# print(len(ret))

ret = soup.select('li.hello')  # li标签下  类 为 : hello
# print(ret)

# xpath /  相当于 soup中 >
ret = soup.select('div.tang > ul > li,list')
# print(ret)
# print(len(ret))

# !!! 可以使用[表示条件],但是不能加@
# ! ! ! 不能使用contains
ret = soup.select('div[class="tang"]')
print(ret)



 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值