python学习笔记(BeautifulSoup4)

这篇博客介绍了如何使用BeautifulSoup4进行网页元素筛选,通过soup.select()方法,可以像CSS那样选择标签、类名和id,返回结果为list类型。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

BeautifulSoup4是一个从html或者xml中提取数据的py库。

lxml是局部遍历,BS是基于HTML DOM的,会载入整个文档,解析整个DOM树,时间和空间都会大很多。

#创建BS对象
soup = BeautifulSoup(html)
#格式化打印出整个soup对象的内容
print ( soup.prettify())

1.Tag 就是html中的一个个标签

tag有两个重要的属性,name和attrs

2.NavigableString  就是指内容

#打印出标签p中的内容
print ( soup.p.string)

3.BeautifulSoup 表示的是一个文档的内容

⼤部分时候,可以把它当作 Tag 对象, 是⼀个特殊的 Tag

4.Comment 特殊的NavigableString对象

输出的内容不包括注释符号



遍历文档树:
1.直接子节点:.content和.children属性

.content
tag 的 .content 属性可以将tag的⼦节点以列表的⽅式输出
print ( soup.head.contents)
#[<title>The Dormouse's story</title>]
输出⽅式为列表, 我们可以⽤列表索引来获取它的某⼀个元素
print ( soup.head.contents[ 0 ])
#<title>The Dormouse's story</title>

.children
它返回的 是⼀个 list ⽣成器对象
print ( soup.head.children)
#<listiterator object at 0x7f71457f5710>
for child in soup.body.children:
    print ( child)


2.所有子孙节点:.descendants属性

contents 和 .children 属性仅包含tag的直接⼦节点, .descendants 属性可以 对所有tag的⼦孙节点进⾏递归循环, 和 children类似, 我们也需要遍历获取 其中的内容。
for child in soup.descendants:
    print ( child)

3.节点内容:.string属性

如果tag只有⼀个 NavigableString 类型⼦节点,那么这个tag可以使⽤ .string 得到⼦节点。 如果⼀个tag仅有⼀个⼦节点,那么这个tag也可以使⽤ .string ⽅ 法,输出结果与当前唯⼀⼦节点的 .string 结果相同。
通俗点说就是: 如果⼀个标签⾥⾯没有标签了, 那么 .string 就会返回标签⾥ ⾯的内容。 如果标签⾥⾯只有唯⼀的⼀个标签了, 那么 .string 也会返回最⾥ ⾯的内容。


搜索⽂档树
1. find_all(name, attrs, recursive, text, **kwargs)
1 name 参数
name 参数可以查找所有名字为 name 的tag,字符串对象会被⾃动忽略掉
A. 传字符串
最简单的过滤器是字符串.在搜索⽅法中传⼊⼀个字符串参数,Beautiful Soup 会查找与字符串完整匹配的内容,下⾯的例⼦⽤于查找⽂档中所有的 <b> 标 签:
soup.find_all( 'b')
# [<b>The Dormouse's story</b>]

B.传正则表达式
如果传⼊正则表达式作为参数,Beautiful Soup会通过正则表达式的 match() 来匹配内容.下⾯例⼦中找出所有以b开头的标签,这表示 <body> 和 <b> 标签 都应该被找到
import re
for tag in soup.find_all(re.compile("^b")):
    print(tag.name)
# body
# b

C.传列表
如果传⼊列表参数,Beautiful Soup会将与列表中任⼀元素匹配的内容返回.下 ⾯代码找到⽂档中所有 <a> 标签和 <b> 标签:
soup.find_all([ "a" , "b" ])
# [<b>The Dormouse's story</b>,
# <a class="sister" href=" http://example.com/elsie"; id="link1">Els
ie</a>,
# <a class="sister" href=" http://example.com/lacie"; id="link2">Lac
ie</a>,
# <a class="sister" href=" http://example.com/tillie"; id="link3">Ti
llie</a>]

2) keyword 参数
soup.find_all(id= 'link2' )
# [<a class="sister" href=" http://example.com/lacie" ; id="link2">Lac
ie</a>]


3) text 参数
通过 text 参数可以搜搜⽂档中的字符串内容, 与 name 参数的可选值⼀样, text 参数接受 字符串 , 正则表达式 , 列表
soup.find_all(text= "Elsie" )
# [u'Elsie']


CSS选择器
这就是另⼀种与 find_all ⽅法有异曲同⼯之妙的查找⽅法.
  •     写 CSS 时, 标签名不加任何修饰, 类名前加 . , id名前加 #
  •     在这⾥我们也可以利⽤类似的⽅法来筛选元素, ⽤到的⽅法是soup.select() , 返回类型是 list
1 ) 通过标签名查找
6 ) 获取内容

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值