记录下BeautifulSoup 的 find、find_all、select 方法的区别及各自的用处。

方法简介

  • find():返回找到的第一个标签
  • find_all():以list的形式返回找到的所有标签
  • limit():指定返回的标签个数
  • attrs():将标签属性放到一个字典中
  • string:获取标签下的非标签字符串(值), 返回字符串
  • strings:获取标签下的所有非标签字符串, 返回生成器。
  • stripped_strings:获取标签下的所有非标签字符串,并剔除空白字符,返回生成器。
  • get_text:获取标签下的所有非标签字符串,返回字符串格式
  • contents:返回某个标签下的直接子元素,包含字符串,返回的是一个列表
  • children:返回某个标签下的直接子元素,包含字符串,返回的是一个生成器
//构建html用于解析
from bs4 import BeautifulSoup
html = '''
<table>
<tr class='a1'>
    <td>职位名称</td>
    <td>职位类别</td>
    <td>时间</td>
</tr>
<tr class='a1'>
    <td><a id='test' class='test' target='_blank' href='https://www.baidu.com/'>职位一</a></td>
    <td>类别一</td>
    <td>时间1</td>
</tr>
<tr class='a2'>
    <td><a id='test' class='test' target='_blank' href='https://www.baidu.com/'>职位二</a></td>
    <td>类别二</td>
    <td>时间2</td>
</tr class='a3'>
<tr>
    <td><a id='test' class='test' target='_blank' href='https://www.baidu.com/'>职位3</a></td>
    <td>类别3</td>
    <td>时间3</td>
</tr>
</table>
<div>
这是一个div
<p>
<!-- 这是一个注释 -->
</p>
</div>
'''
soup = BeautifulSoup(html,'lxml') # 解析html

select 方法和find_all极其相似

find_all()

通过标签名查找

print(soup.select('title'))
# [<title>The Dormouse's story</title>]

print(soup.select('a'))
# [<a class="sister" href="http://example.com/elsie" id="link1"><!-- Elsie --></a>, <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>, <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]

print(soup.select('b'))
# [<b>The Dormouse's story</b>]

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

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

limit 可指定返回的标签数量

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

通过类名查找

方法一: class_

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

方法二: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

通过id名查找

方法一:id和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

获取所有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)

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

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)

获取所有非标记性字符

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

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

获取所有非空字符

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)

get_text 获取所有职位信息

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

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

select()

返回类型是list

通过标签名查找

trs = soup.select('tr') 

获取第二个tr标签

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

通过类名查找

Python爬虫用select方法提取的标签的属性带有空格的解决方法:把空格的位置换成.就可以了

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

根据id名查找

alist = soup.select('#test');

属性查找

查找时还可以加入属性元素,属性需要用中括号括起来,注意属性和标签属于同一节点,所以中间不能加空格,否则会无法匹配到。

alist = soup.select('a[href="https://www.baidu.com/"]');

组合查找

组合查找是使用以上4种查找方式,查询条件使用空格分隔。

alist = soup.select('tr #test');# tr标签中,id为test的标签
alist = soup.select('table > tr');# 子标签查找

提取所有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'])

获取所有的职位信息

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