当前位置: 移动技术网 > IT编程>脚本编程>Python > Python爬虫初探(七)——爬虫之Beautifulsoup4介绍(Ⅰ)

Python爬虫初探(七)——爬虫之Beautifulsoup4介绍(Ⅰ)

2020年07月30日  | 移动技术网IT编程  | 我要评论

一、bs4的简介
二、bs4的简单使用
三、遍历功能

一、bs4的简介

Beautiful Soup 是一个可以从HTML或XML文件中提取数据的网页信息提取库。跟之前介绍的xpath方法有些类似,但操作上比xpath更方便。
安装方法:
pip install lxml
pip install bs4

二、bs4的简单使用

1.bs4的基本操作

先导入bs4模块

import bs4
from bs4 import BeautifulSoup

还是来xpath中的例子

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

这是一些简单的操作:

# 获取bs对象
bs = BeautifulSoup(html_doc,'lxml')

# 打印文档内容(把我们的标签更加规范的打印)
print(bs.prettify())

# 获取title标签内容
print(bs.title)  
# 打印结果:<title>The Dormouse's story</title>

# 获取title标签名称
print(bs.title.name) 
# 打印结果:title

# title标签里面的文本内容
print(bs.title.string)  
# 打印结果:The Dormouse's story

# 获取p段落,通过标签导航找的是第一个
print(bs.p) 
# 打印结果:<p class="title"><b>The Dormouse's story</b></p>

可以发现,bs4和xpath相比,不用再去写路径表达式了,想要获取哪个标签的信息,直接用如上的bs.标签就能实现,非常方便。

2.bs4的对象种类

bs4的对象种类一共有四种:
tag : 标签
NavigableString : 可导航的字符串
BeautifulSoup : bs对象
Comment : 注释
我们拿上面的命令来看看:

# bs对象
print(type(bs))  # 结果:<class 'bs4.BeautifulSoup'>

# 标签
print(type(bs.title))  # 结果:<class 'bs4.element.Tag'>
print(type(bs.a))  # 结果:<class 'bs4.element.Tag'>
print(type(bs.p))  # 结果:<class 'bs4.element.Tag'>

# 可导航的字符串
print(type(bs.p.string)) # 结果:<class 'bs4.element.NavigableString'>

# 注释
# 将html修改一下
html_comment = '<b><!--注释--></b>'

bs = BeautifulSoup(html_comment,'lxml')

print(type(bs.b.string)) # 结果:<class 'bs4.element.Comment'>

三、遍历功能

1.遍历子节点

contents 返回的是一个列表
children 返回的是一个迭代器通过这个迭代器可以进行迭代
descendants 返回的是一个生成器遍历子子孙孙

什么意思呢,解释一下,迭代 iterate指的是按照某种顺序逐个访问列表中的某一项,例如 Python中的for语句;而循环 loop指满足某些条件下,重复执行某一段代码,例如 Python中的while语句。

soup = BeautifulSoup(html_doc,'lxml')

links = soup.contents     
for li in links:
    r = li.find_all('a')
    for l in r:
        print(l.string)    # 遍历a标签下的字符串Elsie,Lacie,Tillie
print(links)               # 将整个html文本以列表形式返回

这次换个简单的结构

html = '''
<div>
<a href='#'>蜘蛛侠</a>
<a href='#'>钢铁侠</a>
<a href='#'>绿巨人</a>
</div>
'''
soup2 = BeautifulSoup(html,'lxml')

links = soup.div.children
print(type(links))
# 结果:<class 'list_iterator'>

for link in links:
    print(link)
# 结果:中间有空行
<a href='#'>蜘蛛侠</a>

<a href='#'>钢铁侠</a>

<a href='#'>绿巨人</a>
# descendants 返回的是一个生成器遍历子子孙孙
for x in soup2.descendants:
    print('----------------')
    print(x)

结果如下:这只是一部分,最终会遍历到a标签下的名字,大家可以试一试,就像剥洋葱一样,一层一层剥开。还能发现,遍历的同时可以自动补全html的结构标签,是不是很棒?

----------------
<html><body><div>
<a href="#">蜘蛛侠</a>
<a href="#">钢铁侠</a>
<a href="#">绿巨人</a>
</div>
</body></html>
----------------
<body><div>
<a href="#">蜘蛛侠</a>
<a href="#">钢铁侠</a>
<a href="#">绿巨人</a>
</div>
</body>
----------------

有时我们需要获取多个标签内容,还想删掉多余的空格,这时该怎么办呢?

# strings 返回是一个生成器对象用过来获取多个标签内容
# stripped strings 和strings基本一致 但是它可以把多余的空格去掉

strings1 = soup2.strings
strings2 = soup2.stripped_strings

现在看是有空行

print(strings1)
# 结果:

蜘蛛侠


钢铁侠


绿巨人

现在看是不是空行就消除

print(strings2)
# 结果:
蜘蛛侠
钢铁侠
绿巨人

bs4部分的内容就先介绍这么多,剩下的部分咱们在下一章里接着聊。
 
 
 
第一篇:Python的要点(搭建环境、安装配置、第三方库导入方法详细过程)
第二篇:Python爬虫初探(一)——了解爬虫
第三篇:Python爬虫初探(二)——爬虫的请求模块
第四篇:Python爬虫初探(三)——爬虫之正则表达式介绍
第五篇:Python爬虫初探(四)——爬虫之正则表达式实战(爬取图片)
第六篇:Python爬虫初探(五)——爬虫之xpath与lxml库的使用
第七篇:Python爬虫初探(六)——爬虫之xpath实战(爬取高考分数线信息)

本文地址:https://blog.csdn.net/brilliant666/article/details/107647797

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网