来自:zip11 > 馆藏分类
配色: 字号:
BeautifulSoup 中的 find,find_all
2022-05-13 | 阅:  转:  |  分享 
  
https://www.cnblogs.com/keye/p/7868059.htmlBeautifulSoup中的find,find_
all1.一般来说,为了找到BeautifulSoup对象内任何第一个标签入口,使用find()方法。以上代码是一个生态金字塔的简
单展示,为了找到第一生产者,第一消费者或第二消费者,可以使用BeautifulSoup。找到第一生产者:生产者在第一个
标签里,因为生产者在整个html文档中第一个标签中出现,所以可以使用find()方法找到第一生产者,在ecologica
lpyramid.py中写入下面一段代码,使用ecologicalpyramid.html文件创建BeautifulSoup对象。
frombs4importBeautifulSoupwithopen(''ecologicalpyramid.html'',
''r'')asecological_pyramid:#ecological生态系统pyramid金字塔soup=
BeautifulSoup(ecological_pyramid)producer_entries=soup.find(''ul
'')print(producer_entries.li.div.string)输出结果:plants2.find()find函数:
find(name,attrs,recursive,text,wargs)#recursive递归的,循环的这些
参数相当于过滤器一样可以进行筛选处理。不同的参数过滤可以应用到以下情况:查找标签,基于name参数查找文本,基于text参数基于正
则表达式的查找查找标签的属性,基于attrs参数基于函数的查找通过标签查找:可以传递任何标签的名字来查找到它第一次出现的地方。找到
后,find函数返回一个BeautifulSoup的标签对象。frombs4importBeautifulSoupwith
open(''ecologicalpyramid.html'',''r'')asecological_pyramid:soup=
BeautifulSoup(ecological_pyramid,''html'')producer_entries=soup
.find(''ul'')print(type(producer_entries))?输出结果:t.Tag''>通过文本查找:直接字符串的话,查找的是标签。如果想要查找文本的话,则需要用到text参数。如下所示:frombs4
importBeautifulSoupwithopen(''ecologicalpyramid.html'',''r'')as
ecological_pyramid:soup=BeautifulSoup(ecological_pyramid,''htm
l'')producer_string=soup.find(text=''plants'')print(plants_strin
g)输出:plants通过正则表达式查找:有以下html代码:想找出第一个邮箱地址,但是第一个邮箱地址没有标签包含,所以通过其他方
式很难找到。但是可以将邮箱地址进行正则表达式处理。importrefrombs4importBeautifulSoupem
ail_id_example="""
ThebelowHTMLhastheinformation
thathasemailids.
abc@example.com
xyz@example.comiv>foo@example.com"""soup=BeautifulSoup(email_id
_example)emailid_regexp=re.compile("\w+@\w+\.\w+")#regexp表达式
对象first_email_id=soup.find(text=emailid_regexp)print(first_ema
il_id)输出结果:abc@example.com通过标签属性进行查找:上面html代码,其中第一个消费者在ul标签里面且id属
性为priaryconsumer(priaryconsumer一次消费者,初级消费者)。frombs4importBeau
tifulSoupwithopen(''ecologicalpyramid.html'',''r'')asecological_p
yramid:soup=BeautifulSoup(eccological_pyramid,''html'')primary_
consumer=soup.find(id=''primaryconsumers'')print(primary_consumer
.li.div.string)输出结果:deer基于定制属性查找:通过标签属性查找的方式适用大多数标签属性,包括id,style,
title,但有“-”,Class标签属性例外。比如html5标签中的data-custom属性,如果我们这样customatt
r="""custoattributeexample

"""custo
msoup=BeautifulSoup(customattr,''lxml'')customSoup.find(data-cus
tom="custom")那么则会报错。原因是在python中变量不能含有"-"这个字符,而我们传递的data-custom有这个
字符。解决办法是在attrs属性用字典进行传递参数。using_attrs=customsoup.find(attrs={''d
ata-custom'':''custom''})print(using_attrs)基于css类的查找:class是python的保留
关键字,所以无法使用class这个关键字。第一种方法:在attrs属性用字典进行传递参数css_class=soup.find
(attrs={''class'':''primaryconsumers''})print(css_class)?第二种方法:Beauti
fulSoup中的特别关键字参数class_。css_class=soup.find(class_=''primarycon
sumers'')?基于定义的函数进行查找:可以传递函数到find()来基于函数定义的条件查找。函数必须返回True或False。d
efis_secondary_consumers(tag):returntag.has_attr(''id'')andtag.
get(''id'')==''secondaryconsumers''secondary_consumer=soup.find(i
s_secondary_consumers)print(secondary_consumer.li.div.string)输出:f
ox将方法进行组合后进行查找:可以用其中任何方法进行组合进行查找,比如同时基于标签名和id号。3.find_all查找find()
查找第一个匹配结果出现的地方,find_all()找到所有匹配结果出现的地方。查找所有3级消费者:all_tertiarycons
umers=soup.find_all(class_=''tertiaryconsumerslist'')#tertiary
第三的其中all_tertiaryconsumers的类型是列表。所以对其列表进行迭代,循环输出三级消费者的名字。fortert
iaryconsumerinall_tertiaryconsumers:print(tertiaryconsumer.div.
string)?输出结果:liontigerfind_all()的参数:find_all(name,attrs,recursi
ve,text,limit,kwargs)limit参数可以限制得到的结果的数目。参照前面的邮件地址例子,得到所有邮件地
址:email_ids=soup.find_all(text=emailid_regexp)print(email_ids)输
出结果:[u''abc@example.com'',u''xyz@example.com'',u''foo@example.com'']使用l
imit参数:email_ids_limited=soup.find_all(text=emailid_regexp,lim
it=2)print(email_ids_limited)限制得到两个结果,所以输出结果:[u''abc@example.com
'',u''xyz@example.com'']可以向find函数传递True或False参数,如果传递True给find_all(),
则返回soup对象的所有标签。对于find()来说,则返回soup对象的第一个标签。all_texts=soup.find_a
ll(text=True)print(all_texts)输出结果:同样,可以在传递text参数时传递一个字符串列表,那么find
_all()会找到挨个在列表中定义过的字符串。all_texts_in_list=soup.find_all(text=[''p
lants'',''algae''])print(all_texts_in_list)输出结果:[u''plants'',u''alage
'']这个同样适用于查找标签,标签属性,定制属性和CSS类。如:div_li_tags=soup.find_all([''div''
,''li''])并且find()和find_all()都会查找一个对象所有后辈们,不过可以通过recursive参数控制。(rec
ursive回归,递归)如果recursive=False,只会找到该对象的最近后代。通过标签之间的关系进行查找查找父标签通过fi
nd_parents()或find_parent()。它们之间的不同类似于find()和find_all()的区别。find_pa
rents()返回全部的相匹配的父标签,而find_parent()返回最近一个父标签。适用于find()的方法同样适用于这两个方
法。在第一消费者例子中,可以找到离Primaryconsumer最近的ul父标签。primaryconsumers=soup.
find_all(class_=''primaryconsumerlist'')primaryconsumer=primary
consumers[0]parent_ul=primaryconsumer.find_parents(''ul'')print(p
arent_ul)一个简单的找到一个标签的父标签的方法是使用find_parent()却不带任何参数。immediateprima
ry_consumer_parent=primary_consumer.find_parent()查找同胞标签在同一个等级,这
些标签是同胞关系,比如参照上面金子塔例子,所有的ul标签就是同胞的关系。上面的ul标签下的producers,primarycon
sumers,,secondaryconsumers,teriaryconsumers就是同胞关系。div下的plants和alg
ae不是同胞关系,但是plants和临近的number是同胞关系。BeautifulSoup自带查找同胞的方法。比如find_n
ext_siblings()和find_next_sibling()查找对象下面的同胞。(sibling兄弟姐妹)producer
s=soup.find(id=''producers'')next_siblings=producers.find_nex
t_siblings()print(next_siblings)输出结果将会输出与之临近的下面的所有同胞html代码。查找下一个对每一个标签来说,下一个元素可能会是定位字符串,标签对象或者其他BeautifulSoup对象,我们定义下一个元素为当前元素最靠近的元素。这不用于同胞定义,我们有方法可以找到我们想要标签的下一个其他元素对象。find_all_next()找到与当前元素最靠近的所有对象。而find_next()找到离当前元素最接近的对象。比如,找到在第一个div标签后的所有li标签first_div=soup.divall_li_tags=first_div.find_all_next(''li'')?查找上一个与查找下一个相反的是查找前一个,用find_previous()和find_all_previous()。1
献花(0)
+1
(本文系zip11首藏)