每日一模块——BeautifulSoup4

本文详细介绍了BeautifulSoup库的使用方法,包括如何读取并格式化HTML文件内容,理解Tag、NavigableString、BeautifulSoup和Comment四种对象类型,以及如何获取标签、修改属性、处理注释等内容。此外,还提供了实例代码帮助读者快速上手。

本文 Github/javamap 已收录,有Java程序员进阶技术知识地图以及我的系列文章,欢迎大家Star。

BeautifulSoup是一个可以从HTML或XML文件中提取数据的python库。

 

“Beautiful Soup提供一些简单的、python式的函数用来处理导航、搜索、修改分析树等功能。它是一个工具箱,通过解析文档为用户提供需要抓取的数据,因为简单,所以不需要多少代码就可以写出一个完整的应用程序。

Beautiful Soup自动将输入文档转换为Unicode编码,输出文档转换为utf-8编码。你不需要考虑编码方式,除非文档没有指定一个编码方式,这时,Beautiful Soup就不能自动识别编码方式了。然后,你仅仅需要说明一下原始编码方式就可以了。

Beautiful Soup已成为和lxml、html6lib一样出色的python解释器,为用户灵活地提供不同的解析策略或强劲的速度。”

创建本地文件index.html,写入如下

 

 

1、读取内容,格式化输出

 

import bs4

soup = bs4.BeautifulSoup(open('E:\indext.html'), 'html.parser') # this is the path of index.html

# open index.html, and create a object soup

print (soup.prettify())

# format and print

2、四大对象种类

 

  • Tag
  • NavigableString
  • BeautifulSoup
  • Comment

(1)Tag:标签

 

<title>hello</titile> <a>world</a>......

上面的每一个色块就构成了一个标签,也就是说标签除了HTML标签,还包括中间的内容。

如何获取标签呢?

我们可以这样写:(蓝色背景的为输出)

print soup.p

<p class="title" name="dromouse"><b>The Dormouse's story</b></p>

虽然HTML内容中有好些个p标签,但是这种形式的调用,只会输出所有内容中第一个符合要求的标签

对象的类型可以通过type获得,即:

print type(soup.p)

<class 'bs4.element.Tag'>

 

对于Tag, 它有两个重要的属性,name 和 attrs

print soup.name

print soup.p.name

[doucument]

p

soup对象本身比较特殊,它的name即为[document],对于其他内部标签,输出的值便为标签本身的名称。

print soup.p.attrs

{u'class': [u'title'], u'name': u'dromouse'}

p标签的所有属性打印出来,得到的类型是一个字典

如果想要单独获取某个属性,可以给定属性名称

print(soup.p['class']) or print soup.p.get('class')

[u'title']

对属性和内容进行修改

soup.p['class'] = 'newClass'

print soup.p

<p class="newClass" name="dromouse"><b>The Dormouse's story</b></p>

对属性进行删除

del soup.p['class']

<p name="dromouse"><b>The Dormouse's story</b></p>

 

(2)NavigableString

上面介绍了获取标签内容,而.string可以获得标签内部的文字

print soup.p.string

The Dormouse's story

类型是NavigableString,同样可以通过type获得

 

(3)BeautifulSoup

BeautifulSoup对象表示的是一个文档的全部内容,大部分时候,可以把它当做Tag对象,是一个特殊的Tag

print type(soup.name)

<type 'unicode'>

 

 (4)Comment

comment对象是一个特殊类型的NavigableString对象,其实输出的内容仍然不包括注释符号,但是如果不好好处理,可能会给我们的文本处理造成麻烦

print type(soup.p.string)

print type(soup.a.string)

print soup.a.string

<class 'bs4.element.NavigableString'>
<class 'bs4.element.Comment'>
 Elsie

可以看到soup.a.string是comment类型,并且其中的注释符号被去掉了,这会带来麻烦。

所以这样的情况,我们需要事先做下判断:if type(soup.a.string) == bs4.element.comment:

 

-- END --

日常求赞:你好技术人,先赞后看养成习惯,你的赞是我前进道路上的动力,对我非常重要。

加油技术人!

简介: 博主从华中科技大学硕士毕业,是一个对技术有追求,对生活有激情的程序员。几年间浪迹于多个一线互联网大厂,具有多年开发实战经验。

微信搜索公众号【爱笑的架构师】,我有技术和故事,等你来。

文章持续更新,在 Github/javamap 中可以看到我归档的系列文章,有面试经验和技术干货,欢迎Star。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值