欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-04-16 16:17:25
一、bs4的简介二、bs4的简单使用一、bs4的简介Beautiful Soup 是一个可以从HTML或XML文件中提取数据的网页信息提取库。跟之前介绍的xpath方法有些类似,但操作上比xpath更方便。安装方法:pip install lxmlpip install bs4二、bs4的简单使用先导入bs4模块import bs4from bs4 import BeautifulSouphtml_doc = """

一、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

相关标签: python 爬虫