区分select()和find_all()

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))
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,335评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,895评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,766评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,918评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,042评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,169评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,219评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,976评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,393评论 1 304
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,711评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,876评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,562评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,193评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,903评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,142评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,699评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,764评论 2 351