Python : Beautiful Soup搜索文档树

本文详细介绍了BeautifulSoup库中用于搜索文档树的主要方法,如find_all()和find(),以及如何使用过滤器、正则表达式、列表、方法等进行搜索。文章通过实例演示了如何查找特定标签、属性、文本内容,并解释了参数的作用,如name、attrs、recursive、text等。此外,还提到了CSS选择器的支持和如何通过CSS类名、ID等进行搜索。
摘要由CSDN通过智能技术生成

搜索文档树
Beautiful Soup定义了很多搜索方法,这里着重介绍2个: find() 和 find_all() .其它方法的参数和用法类似,请读者举一反三.

再以“爱丽丝”文档作为例子:

html_doc = “”"

The Dormouse's story

The Dormouse's story

Once upon a time there were three little sisters; and their names were Elsie, Lacie and Tillie; and they lived at the bottom of a well.

...

"""

from bs4 import BeautifulSoup
soup = BeautifulSoup(html_doc)
使用 find_all() 类似的方法可以查找到想要查找的文档内容

过滤器
介绍 find_all() 方法前,先介绍一下过滤器的类型 [3] ,这些过滤器贯穿整个搜索的API.过滤器可以被用在tag的name中,节点的属性中,字符串中或他们的混合中.

字符串
最简单的过滤器是字符串.在搜索方法中传入一个字符串参数,Beautiful Soup会查找与字符串完整匹配的内容,下面的例子用于查找文档中所有的标签:

soup.find_all(‘b’)

[The Dormouse’s story]

如果传入字节码参数,Beautiful Soup会当作UTF-8编码,可以传入一段Unicode 编码来避免Beautiful Soup解析编码出错

正则表达式
如果传入正则表达式作为参数,Beautiful Soup会通过正则表达式的 match() 来匹配内容.下面例子中找出所有以b开头的标签,这表示和标签都应该被找到:

import re
for tag in soup.find_all(re.compile("^b")):
print(tag.name)

body

b

下面代码找出所有名字中包含”t”的标签:

for tag in soup.find_all(re.compile(“t”)):
print(tag.name)

html

title

列表
如果传入列表参数,Beautiful Soup会将与列表中任一元素匹配的内容返回.下面代码找到文档中所有标签和标签:

soup.find_all([“a”, “b”])

[The Dormouse’s story,

Elsie,

Lacie,

Tillie]

True
True 可以匹配任何值,下面代码查找到所有的tag,但是不会返回字符串节点

for tag in soup.find_all(True):
print(tag.name)

html

head

title

body

p

b

p

a

a

a

p

方法
如果没有合适过滤器,那么还可以定义一个方法,方法只接受一个元素参数 [4] ,如果这个方法返回 True 表示当前元素匹配并且被找到,如果不是则反回 False

下面方法校验了当前元素,如果包含 class 属性却不包含 id 属性,那么将返回 True:

def has_class_but_no_id(tag):
return tag.has_attr(‘class’) and not tag.has_attr(‘id’)
将这个方法作为参数传入 find_all() 方法,将得到所有

标签:

soup.find_all(has_class_but_no_id)

[

The Dormouse’s story

,

Once upon a time there were…

,

]

返回结果中只有

标签没有标签,因为标签还定义了”id”,没有返回和,因为和中没有定义”class”属性.

下面代码找到所有被文字包含的节点内容:

from bs4 import NavigableString
def surrounded_by_strings(tag):
return (isinstance(tag.next_element, NavigableString)
and isinstance(tag.previous_element, NavigableString))

for tag in soup.find_all(surrounded_by_strings):
print tag.name

p

a

a

a

p

现在来了解一下搜索方法的细节

find_all()
find_all( name , attrs , recursive , text , **kwargs )

find_all() 方法搜索当前tag的所有tag子节点,并判断是否符合过滤器的条件.这里有几个例子:

soup.find_all(“title”)

[The Dormouse’s story]

soup.find_all(“p”, “title”)

[

The Dormouse’s story

]

soup.find_all(“a”)

[Elsie,

Lacie,

Tillie]

soup.find_all(id=“link2”)

[Lacie]

import re
soup.find(text=re.compile(“sisters”))

u’Once upon a time there were t

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值