BeautifulSoup 的 find、find_all、select 方法
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极其相似
定义一个html,并使用BeautifulSoup的lxml解析
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
find_all()
获取所有的tr标签
find 返回找到的第一个标签,find_all以list的形式返回找到的所有标签
trs = soup.find_all('tr') # 返回列表
n=1
for i in trs: print('第{}个tr标签:'.format(n)) print(i)
n+=1
获取第二个tr标签
limit 可指定返回的标签数量
trs = soup.find_all('tr',limit=2)[1] # 从列表中获取第二个元素,limit 获取标签个数
print(trs)
获取class='a1'的tr标签
方法一: 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='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
获取所有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()
获取所有tr标签
trs = soup.select('tr') for i in trs: print('tr标签:',i)
获取第二个tr标签
trs = soup.select('tr')[1] print(trs)
获取所有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)
提取所有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))