初识python 之 爬虫: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极其相似

以实际例子作说明:

1、定义一个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

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))

 

版权声明:本文为simple-li原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/simple-li/p/11253312.html