Python随记(26)BeautifulSoup4库

BeautifulSoup4库

与lxml一样是HTML/XML的解析器,主要功能就是解析提取数据。

lxml只会局部历遍,而BeautifulSoup是基于HTML DOM(Document Object Model文档对象模型)的,会载入整个文档,解析整个DOM树,因此时间和内存开销都很大,性能低于lxml

解析工具速度使用难度
bs4最慢最简单
lxml简单
正则表达式最快最难
from bs4 import BeautifulSoup
soup = BeautifulSoup(html,'lxml')  # 解析器 
print(soup。prettify)  # 让格式更加美观

来自帮助文档。。。脑补链接
在这里插入图片描述

常用对象

Beautiful Soup 将复杂的HTML文档转换成一个复杂的树形结构,每个节点都是python对象,所有对象可以分成4种:

  • Tag
  • NavigableString
  • BeautifulSoup
  • Comment

使用对象:

html = """
<html><head><title>The Dormouse's story</title></head>
<body>
<p class="title" name="dromouse"></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> and
<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>
<b><!--Hey, buddy. Want to buy a used parser?--></b>
"""
  1. Tag: 就是HTML中的一个个标签,可以利用soup加标签名轻松获取这些标签的内容,这些对象的类型是bs4.element.Tag 。但是它查找的是在所有内容中第一个符合要求的标签。
soup = BeautifulSoup(html,'lxml')
print(soup.a)   # 获取名为a的标签
print(soup.a.name)   # 获取a 标签的标签名
print(soup.a.attrs)   # 获取a 标签的所有属性,是字典形式,所以可以索引,也可以修改
print(soup.a.get('class')) # 获取class 属性对应的值
  1. NavigableString :拿到标签后,还想获取标签中的内容。可以通过tag.string 获取标签中的文字。
print(soup.a.string)    # 用法和字符串一样
  1. BeautifulSoup : 这个对象表示的是一个文档的全部内容,大部分的时候,可以把他当作Tag 对象。支持历遍文档树 和搜索文档树中表示的大部分方法。
    它继承自Tag 对象,所以Tag 对象的属性和方法它都能用

  2. Comment ; 以上三个对象基本覆盖了HTML和XML中的所有内容。但是还有一些特殊对象,就像文档的注释部分。
    Comment 就是一个特殊类型的 NavigableString 对象

遍历文档树

  1. contents和children: 一个返回所有子节点的列表 后一个返回所有子节点的迭代器
head_tag = soup.head  # 一个节点
head_tag.contents   # 获得这个节点下的所有子节点,返回一个列表
for i in head_tag.children:   # 返回一个迭代器
	print(i)
  1. strings 和 stripped_strings: strings 如果tag中包含多个字符串,可以使用 .string 来循环获取。 但输出的字符串中可能包含了许多空格和空行,使用 .stripped_string 可以取出多余空白内容
for string in soup.strings:   # 获取所有的字符串内容
	print(string)  # 这个是有很多空格空行的

for string in soup.stripped_strings:
	print(string)   # 这个就自动去除了

string :获取某个标签下的非标签字符,返回字符串,如果这个标签有多行字符,那么就不能获取了。

strings: 获取某个标签下的子孙非标签字符串,返回一个生成器。

stripped_strings : 获取某个标签下的子孙非标签字符串,会去掉空白,返回生成器

搜索文档树

  1. find和find_all 方法: find方法是找到第一个满足条件的标签后立即返回,只返回一个i元素,find_all 方法是把所有满足条的标签都返回,一个列表。
html = """
<table class="tablelist" cellpadding="0" cellspacing="0">
    <tbody>
        <tr class="h">
            <td class="l" width="374">职位名称</td>
            <td>职位类别</td>
            <td>人数</td>
            <td>地点</td>
            <td>发布时间</td>
        </tr>
        <tr class="even">
            <td class="l square"><a target="_blank" href="position_detail.php?id=33824&keywords=python&tid=87&lid=2218">22989-金融云区块链高级研发工程师(深圳)</a></td>
            <td>技术类</td>
            <td>1</td>
            <td>深圳</td>
            <td>2017-11-25</td>
        </tr>
        <tr class="odd">
            <td class="l square"><a target="_blank" href="position_detail.php?id=29938&keywords=python&tid=87&lid=2218">22989-金融云高级后台开发</a></td>
            <td>技术类</td>
            <td>2</td>
            <td>深圳</td>
            <td>2017-11-25</td>
        </tr>
    </tbody>
</table>
"""
soup = BeautifulSoup(html,'lxml')
# 获取tr 标签
print(soup.tr)
print(soup.find('tr'))

# 获取所有tr 标签
trs = soup.find_all('tr')
for i in trs:
	print(i)

# 获取第二个标签
soup.find_all('tr',limit=2)[1]  # 选取前两个标签

# 获取所有class等于even的 tr标签
trs = soup.find_all('tr',class_ = 'even')  # class会重名,所以后面加个下划线
trs = soup.find_all('tr',attrs={'class':'even'}  # 效果一样

# 将所有id 等于test ,class也等于test的a标签提取出
soup.find_all('a',id='test',class_='test')

# 获取所有a标签的href 属性
alist = soup.find_all('a')
for a in alist:
	href = a['href']
	print(href)
	href = a.attrs['href']   # 效果相同

# 获取所有职位信息
trs = soup.find_all('tr')[1:]   # 第一个tr标签的内容不需要
for tr in trs:
	infos = list(tr.stripped_strings)
	print(infos)

搜索文档树

虽然有find find_all 但是有时候使用 css 选择器的方式可以更加方便。css选择器的语法,应该使用select方法。

# 通过标签名查找: 
soup.select('a')   # 所有a 标签,返回一个列表形式

# 通过属性值查找 点操作符
soup.select('.sister')  # 相当于 class = sister 

# 通过id 查找 井号 
soup.select('#link1')

# 组合查找 : 
soup.select('p #link1')  #p 标签中 id 为link1 的内容
# 获取head 标签下的title 标签:
soup.select('head > title')

# 通过属性查找 
soup.select('a[href = “。。。。。”])  # 标签和属性名在同一节点,之间不能有空格的

# 获取内容
soup.select('title')[0].get_text()  # 与stripped_strings 一样,但是它返回的是字符串
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值