数据解析:Beautiful Soup的使用2,find、find_all使用案例

html = """
职位名称 职位类别 人数 地点 发布时间
22989-腾讯云web前端高级工程师 技术类 2 深圳 2018-11-11
21882-腾讯医典Android开发工程师(深圳) 技术类 1 深圳 2018-11-11
21882-腾讯医典IOS开发工程师(深圳) 技术类 1 深圳 2018-11-11
18427-理财通后台开发工程师  技术类 1 深圳 2018-11-11
TEG13-高级系统测试工程师(深圳) 技术类 1 深圳 2018-11-11
SD9-手游客户端开发工程师(深圳)  技术类 1 深圳 2018-11-11
PCG04-PCG研发部前端架构师(深圳) 技术类 1 深圳 2018-11-11
PCG17-QQ钱包客户端开发(深圳) 技术类 1 深圳 2018-11-11
22989-高级AI后台开发工程师(上海/深圳) 技术类 2 上海 2018-11-11
22989-高级AI前端研发工程师(上海/深圳) 技术类 2 上海 2018-11-11
1379个职位
"""
from bs4 import BeautifulSoup soup = BeautifulSoup(html, 'lxml') # 创建 Beautiful Soup 对象 # 使用lxml解析库来进行解析,其他解析库可参考bs4官方文档。 # lxml解析库速度中等,难易度中等 print(soup.prettify()) # 查看解析后的HTML代码 '''1. 获取所有的tr标签''' trs = soup.find_all('tr') # print(trs) # find_all返回的是个列表 for tr in trs: print('--' * 60) print(tr) # print(type(tr)) # '''2. 获取第二个tr标签''' tr = soup.find_all('tr', limit=2)[1] print(tr) # limit=2:指定最多获取2个元素;find_all返回的是列表,下标从0开始,[1]表示获取第二个标签 '''3. 获取所有class等于even的tr标签 指定属性 有两种方式''' trs = soup.find_all('tr', attrs={ 'class': 'even'}) # 第一种方式:attrs={键值对} # trs = soup.find_all('tr', class_='even') # 第二种方式:在写class的时候后面要带_ 因为class是python内置关键字 for tr in trs: print('--' * 60) print(tr) '''4. 将所有id等于test,class也等于test的a标签提取出来 指定多个属性''' aList = soup.find_all('a', attrs={ 'id': 'test', 'class': 'test'}) # aList = soup.find_all('a', id='test', class_='test') for a in aList: print('--' * 60) print(a) '''5. 获取所有a标签的href属性 获取属性所对应的值''' aList = soup.find_all('a') for a in aList: # 1. 通过标签[下标]的方式 href = a['href'] print(href) # 2. 通过.attrs[属性]的方式 href = a.attrs['href'] print(href) '''6. 获取所有的职位信息(纯文本)''' trs = soup.find_all('tr')[1:11] # 获取第一个到第十一个tr标签 zhaopin = { } zhaopins = [] for tr in trs: # 通过遍历每个tr标签 tds = tr.find_all('td') # 来获取到tr下面的td标签 # 再通过下标指定要获取第几个td标签,.string可以获取td标签里对应文本,否则默认获取到的是整个td标签 title = tds[0].string # 职位 category = tds[1].string # 分类 nums = tds[2].string # 招聘人数 city = tds[3].string # 地区 pubtime = tds[4].string # 发布时间 zhaopin['职位'] = title zhaopin['分类'] = category zhaopin['招聘人数'] = nums zhaopin['地区'] = city zhaopin['发布时间'] = pubtime zhaopins.append(zhaopin) # print(zhaopin) # print(zhaopins) '''第二种方式获取HTML标签里的纯文本,更变态、更强大''' infos = tr.strings # 直接获取tr标签下面的所有文本 # print(infos) # 返回的是个生成器generator,可以通过list()转换成列表或者for循环遍历 # for info in infos: # 遍历 # print(info) print(list(infos)) # 直接转换成列表 '''第三种方式,更更变态、更更强大''' infosNX = list(tr.stripped_strings) # 在.strings的基础上自动过滤掉空白字符,[空格 换行符什么的],返回的是个生成器generator,通过list()转换成列表 # print(infosNX) zhaopin['职位'] = infosNX[0] zhaopin['分类'] = infosNX[1] zhaopin['招聘人数'] = infosNX[2] zhaopin['地区'] = infosNX[3] zhaopin['发布时间'] = infosNX[4] zhaopins.append(zhaopin) # print(zhaopin) # print(zhaopins)
'''
find:只返回匹配到的第一个元素,返回字符串'''
a = soup.find('a')
# print(a)  # 与find_all的唯一区别就是它只会获取第一个标签,返回的是个字符串


'''
get_text:获取某个标签下的子孙非标签字符串,返回字符串类型,一次只能获取一个。
因为只能获取一个,所以如果是使用find_all获取标签再使用get_text的话,需要在find_all后面用下标[]的方式指定获取第几个
'''
trr = soup.find_all('tr')[5]
text = trr.get_text()
print(trr)
print(text)
trr = soup.find_all('tr')[5].get_text()
# print(trr)

'''find_all可以用下标[]的方式指定只获取第几个(返回字符串),或者获取一个范围(返回列表)'''
trr1 = soup.find_all('tr')[5]
print(trr1)
trr1 = soup.find_all('tr')[1:5]
print(trr1)

总结:

find_all的使用:

  1. 在提取标签时,第一个参数是标签的名字,如果需要通过标签的属性进行过滤或者通过标签的属性获取对应的值,有两种方式
使用find和find_all的过滤条件     两种方式:

1. 关键词参数:将属性的名字作为关键词参数的名字,属性的值作为关键词参数的值进行过滤
关键词参数:将属性和值对应起来即可:属性=值,
遇到与python内置关键字冲突的属性后面要带个_,如:class_='test'

2. attrs参数:将属性条件放在一个字典表中,以键值对方式传递给attrs参数
使用attrs参数:将所有属性以及对应的值放在字典表中传递给attrs属性即可,如:attrs={'属性': '值'}


获取标签的属性     两种方式:

1. 通过下标:[属性]
2. 通过attrs:.attrs[属性]
  1. 在提取标签时,不需要提取全部结果,可以使用limit参数来限制提取数量
  2. 可以用下标[]的方式指定只获取第几个(返回字符串),或者获取一个范围(返回列表)

find与find_all的区别:

  1. find:找到第一个满足条件的标签就返回结果,只返回匹配到的第一个元素,返回字符串
  2. find_all:将所有满足条件的标签都返回,以列表形式返回

string和strings、stripped_strings属性以及get_text方法:

  1. string:获取某个标签下的非标签字符串,返回字符串类型,如果这个标签下有多行字符,就无法获取到了
  2. strings:获取某个标签下的子孙非标签字符串,返回的是生成器,可以通过list()转换成列表或者for循环遍历
  3. stripped_strings:获取某个标签下的子孙非标签非空白字符串,在.strings的基础上自动过滤掉空白字符[空格 换行符什么的],返回的是生成器,可以通过list()转换成列表或者for循环遍历
  4. get_text:获取某个标签下的子孙非标签字符串,返回字符串类型,一次只能获取一个。
    因为只能获取一个,所以如果是使用find_all获取标签再使用get_text的话,需要在find_all后面用下标[]的方式指定获取第几个



你可能感兴趣的:(网络爬虫,字符串,python,java,web,js)