BeautifulSoup 的 find、find_all、select 方法
admin
2023-07-30 19:56:06
0
from bs4 import BeautifulSoup

lxml 以lxml形式解析html,例:BeautifulSoup(html,’lxml’) #  注:html5lib 容错率最高
find 返回找到的第一个标签
find_all 以list的形式返回找到的所有标签
limit 指定返回的标签个数
attrs 将标签属性放到一个字典中
string 获取标签下的非标签字符串(值), 返回字符串
strings 获取标签下的所有非标签字符串, 返回生成器。
stripped_strings 获取标签下的所有非标签字符串,并剔除空白字符,返回生成器。
get_text # 获取标签下的所有非标签字符串,返回字符串格式
contents、children都是返回某个标签下的直接子元素,包含字符串。 contents 返回一个列表,children 返回一个生成器

select 方法和find_all极其相似

以实际例子作说明:

1、定义一个html,并使用BeautifulSoup的lxml解析

from bs4 import BeautifulSoup
html = '''
职位名称 职位类别 时间
职位一 类别一 时间1
职位二 类别二 时间2
职位3 类别3 时间3
这是一个div

''' soup = BeautifulSoup(html,'lxml') # 解析html

———————————————————— find_all ————————————————————————–

2、获取所有的tr标签 

find 返回找到的第一个标签,find_all以list的形式返回找到的所有标签

trs = soup.find_all('tr') # 返回列表
n=1
for i in trs:
    print('第{}个tr标签:'.format(n))
    print(i)
    n+=1

3、获取第二个tr标签

limit 可指定返回的标签数量

trs = soup.find_all('tr',limit=2)[1]  # 从列表中获取第二个元素,limit 获取标签个数
print(trs)

4、获取class=’a1’的tr标签

a.方法一: class_

trs = soup.find_all('tr',class_='a1')
n=1
for i in trs:
    print('第{}个class=''a1''的tr标签:'.format(n))
    print(i)
    n+=1

b.方法二:attrs 将标签属性放到一个字典中

trs = soup.find_all('tr',attrs={'class':'a1'})
n=1
for i in trs:
    print('第{}个class=''a1''的tr标签:'.format(n))
    print(i)
    n+=1

5、提取所有id=’test’且class=’test’的a标签

方法一:class_

alist = soup.find_all('a',id='test',class_='test')
n=1
for i in alist:
    print('第{}个id=''test''且class=''test''的a标签:'.format(n))
    print(i)
    n+=1

方法二:attrs

alist = soup.find_all('a',attrs={'id':'test','class':'test'})
n=1
for i in alist:
    print('第{}个id=''test''且class=''test''的a标签:'.format(n))
    print(i)
    n+=1

6、获取所有a标签的href属性

alist = soup.find_all('a')

#方法一:通过下标获取
for a in alist:
    href = a['href']
    print(href)

#方法二: 通过attrs获取
for a in alist:
    href = a.attrs['href']
    print(href)

7、获取所有的职位信息(所有文本信息)

string 获取标签下的非标签字符串(值), 返回字符串

注:第一个tr为标题信息,不获取。从第二个tr开始获取。

trs = soup.find_all('tr')[1:]
movies = []
for tr in trs:
    move = {}
    tds = tr.find_all('td')
    move['td1'] = tds[0].string  # string 取td的值
    move['td2'] = tds[1].string
    move['td3'] = tds[2].string
    movies.append(move)
print(movies)

8、获取所有非标记性字符

strings 获取标签下的所有非标签字符串, 返回生成器。

trs = soup.find_all('tr')[1:]
for tr in trs:
    infos = list(tr.strings)  # 获取所有非标记性字符,包含换行、空格
    print(infos)

9、获取所有非空字符

stripped_strings 获取标签下的所有非标签字符串,并剔除空白字符,返回生成器。

trs = soup.find_all('tr')[1:]
for tr in trs:
    infos = list(tr.stripped_strings)  # 获取所有非空字符,不包含换行、空格
    print(infos)
# stripped_strings 获取所有职位信息
trs = soup.find_all('tr')[1:]
movies = []
for tr in trs:
    move = {}
    infos = list(tr.stripped_strings)
    move['职位'] = infos[0]
    move['类别'] = infos[1]
    move['时间'] = infos[2]
    movies.append(move)
print(movies)

10、get_text 获取所有职位信息

get_text  获取标签下的所有非标签字符串,返回字符串格式

trs = soup.find_all('tr')[1]
text = trs.get_text() # 返回字符串格式
print(text)

———————————————————— select ————————————————————————–

11、获取所有tr标签

trs = soup.select('tr')
for i in trs:
    print('tr标签:',i)

12、获取第二个tr标签

trs = soup.select('tr')[1]
print(trs)

13、获取所有class=”al”的tr标签

# 方法一:
trs = soup.select('tr.a1')  # tr标签的class属性
for i in trs:
    print(i)

# 方法二:
trs = soup.select('tr[class="a1"]')  # tr标签的class属性
for i in trs:
    print(i)

14、提取所有a标签的href属性

# 方法一:
a = soup.select('a')
for i in a:
    print(i['href'])

# 方法二:
a = soup.select('a')
for i in a:
    print(i.attrs['href'])

15、获取所有的职位信息

trs = soup.select('tr')
for i in trs:
    print(list(i.stripped_strings))

 

相关内容

热门资讯

Mobi、epub格式电子书如... 在wps里全局设置里有一个文件关联,打开,勾选电子书文件选项就可以了。
定时清理删除C:\Progra... C:\Program Files (x86)下面很多scoped_dir开头的文件夹 写个批处理 定...
scoped_dir32_70... 一台虚拟机C盘总是莫名奇妙的空间用完,导致很多软件没法再运行。经过仔细检查发现是C:\Program...
小程序支付时提示:appid和... [Q]小程序支付时提示:appid和mch_id不匹配 [A]小程序和微信支付没有进行关联,访问“小...
500 行 Python 代码... 语法分析器描述了一个句子的语法结构,用来帮助其他的应用进行推理。自然语言引入了很多意外的歧义,以我们...
pycparser 是一个用... `pycparser` 是一个用 Python 编写的 C 语言解析器。它可以用来解析 C 代码并构...
微信小程序使用slider实现... 众所周知哈,微信小程序里面的音频播放是没有进度条的,但最近有个项目呢,客户要求音频要有进度条控制,所...
65536是2的几次方 计算2... 65536是2的16次方:65536=2⁶ 65536是256的2次方:65536=256 6553...
Apache Doris 2.... 亲爱的社区小伙伴们,我们很高兴地向大家宣布,Apache Doris 2.0.0 版本已于...
项目管理和工程管理的区别 项目管理 项目管理,顾名思义就是专注于开发和完成项目的管理,以实现目标并满足成功标准和项目要求。 工...