前言

我们将利用 Beautiful Soup 模块的搜索功能,根据标签名称、标签属性、文档文本和正则表达式来搜索。
搜索方法
Beautiful Soup 内建的搜索方法如下:
使用 find() 方法搜索
首先还是需要建立一个 HTML 文件用来做测试。
<html> <body> <div class="ecopyramid"> <ul id="producers"> <li class="producerlist"> <div class="name">plants</div> <div class="number">100000</div> </li> <li class="producerlist"> <div class="name">algae</div> <div class="number">100000</div> </li> </ul> <ul id="primaryconsumers"> <li class="primaryconsumerlist"> <div class="name">deer</div> <div class="number">1000</div> </li> <li class="primaryconsumerlist"> <div class="name">rabbit</div> <div class="number">2000</div> </li> </ul> <ul id="secondaryconsumers"> <li class="secondaryconsumerlist"> <div class="name">fox</div> <div class="number">100</div> </li> <li class="secondaryconsumerlist"> <div class="name">bear</div> <div class="number">100</div> </li> </ul> <ul id="tertiaryconsumers"> <li class="tertiaryconsumerlist"> <div class="name">lion</div> <div class="number">80</div> </li> <li class="tertiaryconsumerlist"> <div class="name">tiger</div> <div class="number">50</div> </li> </ul> </div> </body> </html>
我们可以通过 find() 方法来获得 <ul> 标签,默认情况下会得到第一个出现的。接着再获取 <li> 标签,默认情况下还是会得到第一个出现的,接着获得 <div> 标签,通过输出内容来验证是否获取了第一个出现的标签。
from bs4 import BeautifulSoup
with open('search.html','r') as filename:
soup = BeautifulSoup(filename,'lxml')
first_ul_entries = soup.find('ul')
print first_ul_entries.li.div.string
find() 方法具体如下:
find(name,attrs,recursive,text,**kwargs)
正如上代码所示,find() 方法接受五个参数:name、attrs、recursive、text 和 **kwargs 。name 、attrs 和 text 参数都可以在 find() 方法充当过滤器,提高匹配结果的精确度。
搜索标签
除了上面代码的搜索 <ul> 标签外,我们还可以搜索 <li> 标签,返回结果也是返回出现的第一个匹配内容。
tag_li = soup.find('li')
# tag_li = soup.find(name = "li")
print type(tag_li)
print tag_li.div.string
搜索文本
如果我们只想根据文本内容来搜索的话,我们可以只传入文本参数 :
search_for_text = soup.find(text='plants') print type(search_for_text) <class 'bs4.element.NavigableString'>
返回的结果也是 NavigableString 对象 。
根据正则表达式搜索
如下的一段 HTML 文本内容
<div>The below HTML has the information that has email ids.</div> abc@example.com <div>xyz@example.com</div> <span>foo@example.com</span>
可以看到 abc@example 邮件地址并没有包括在任何标签内,这样就不能根据标签来找到邮件地址了。这个时候,我们可以使用正则表达式来进行匹配。
email_id_example = """
<div>The below HTML has the information that has email ids.</div>
abc@example.com
<div>xyz@example.com</div>
<span>foo@example.com</span>
"""
email_soup = BeautifulSoup(email_id_example,'lxml')
print email_soup
# pattern = "\w+@\w+\.\w+"
emailid_regexp = re.compile("\w+@\w+\.\w+")
first_email_id = email_soup.find(text=emailid_regexp)
print first_email_id
在使用正则表达式进行匹配时,如果有多个匹配项,也是先返回第一个。
根据标签属性值搜索
可以通过标签的属性值来搜索:
search_for_attribute = soup.find(id='primaryconsumers') print search_for_attribute.li.div.string
根据标签属性值来搜索对大多数属性都是可用的,例如:id、style 和 title 。
但是对以下两种情况会有不同:
我们不能再直接使用属性值来搜索了,而是得使用 attrs 参数来传递给 find() 函数。
根据自定义属性来搜索
在 HTML5 中是可以给标签添加自定义属性的,例如给标签添加 属性。
如下代码所示,如果我们再像搜索 id 那样进行操作的话,会报错的,Python 的变量不能包括 - 符号。
customattr = """ <p data-custom="custom">custom attribute example</p> """ customsoup = BeautifulSoup(customattr,'lxml') customsoup.find(data-custom="custom") # SyntaxError: keyword can't be an expression
这个时候使用 attrs 属性值来传递一个字典类型作为参数进行搜索:
using_attrs = customsoup.find(attrs={'data-custom':'custom'})
print using_attrs
基于 CSS 中的 类 进行搜索
对于 CSS 的类属性,由于在 Python 中 class 是个关键字,所以是不能当做标签属性参数传递的,这种情况下,就和自定义属性一样进行搜索。也是使用 attrs 属性,传递一个字典进行匹配 。
除了使用 attrs 属性之外,还可以使用 class_ 属性进行传递,这样与 class 区别开了,也不会导致错误。
css_class = soup.find(attrs={'class':'producerlist'})
css_class2 = soup.find(class_ = "producerlist")
print css_class
print css_class2
使用自定义的函数搜索
可以给 find() 方法传递一个函数,这样就会根据函数定义的条件进行搜索。
函数应该返回 true 或者是 false 值。
def is_producers(tag):
return tag.has_attr('id') and tag.get('id') == 'producers'
tag_producers = soup.find(is_producers)
print tag_producers.li.div.string
代码中定义了一个 is_producers 函数,它将检查标签是否具体 id 属性以及属性值是否等于 producers,如果符合条件则返回 true ,否则返回 false 。
联合使用各种搜索方法
Beautiful Soup 提供了各种搜索方法,同样,我们也可以联合使用这些方法来进行匹配,提高搜索的准确度。
combine_html = """
<p class="identical">
Example of p tag with class identical
</p>
<div class="identical">
Example of div tag with class identical
<div>
"""
combine_soup = BeautifulSoup(combine_html,'lxml')
identical_div = combine_soup.find("div",class_="identical")
print identical_div
使用 find_all() 方法搜索
使用 find() 方法会从搜索结果中返回第一个匹配的内容,而 find_all() 方法则会返回所有匹配的项。
在 find() 方法中用到的过滤项,同样可以用在 find_all() 方法中。事实上,它们可以用到任何搜索方法中,例如:find_parents() 和 find_siblings() 中 。
# 搜索所有 class 属性等于 tertiaryconsumerlist 的标签。 all_tertiaryconsumers = soup.find_all(class_='tertiaryconsumerlist') print type(all_tertiaryconsumers) for tertiaryconsumers in all_tertiaryconsumers: print tertiaryconsumers.div.string
find_all() 方法为 :
find_all(name,attrs,recursive,text,limit,**kwargs)
它的参数和 find() 方法有些类似,多个了 limit 参数。limit 参数是用来限制结果数量的。而 find() 方法的 limit 就是 1 了。
同时,我们也能传递一个字符串列表的参数来搜索标签、标签属性值、自定义属性值和 CSS 类。
# 搜索所有的 div 和 li 标签 div_li_tags = soup.find_all(["div","li"]) print div_li_tags print # 搜索所有类属性是 producerlist 和 primaryconsumerlist 的标签 all_css_class = soup.find_all(class_=["producerlist","primaryconsumerlist"]) print all_css_class print
搜索相关标签
一般情况下,我们可以使用 find() 和 find_all() 方法来搜索指定的标签,同时也能搜索其他与这些标签相关的感兴趣的标签。
搜索父标签
可以使用 find_parent() 或者 find_parents() 方法来搜索标签的父标签。
find_parent() 方法将返回第一个匹配的内容,而 find_parents() 将返回所有匹配的内容,这一点与 find() 和 find_all() 方法类似。
# 搜索 父标签
primaryconsumers = soup.find_all(class_='primaryconsumerlist')
print len(primaryconsumers)
# 取父标签的第一个
primaryconsumer = primaryconsumers[0]
# 搜索所有 ul 的父标签
parent_ul = primaryconsumer.find_parents('ul')
print len(parent_ul)
# 结果将包含父标签的所有内容
print parent_ul
print
# 搜索,取第一个出现的父标签.有两种操作
immediateprimary_consumer_parent = primaryconsumer.find_parent()
# immediateprimary_consumer_parent = primaryconsumer.find_parent('ul')
print immediateprimary_consumer_parent
搜索同级标签
Beautiful Soup 还提供了搜索同级标签的功能。
使用函数 find_next_siblings() 函数能够搜索同一级的下一个所有标签,而 find_next_sibling() 函数能够搜索同一级的下一个标签。
producers = soup.find(id='producers') next_siblings = producers.find_next_siblings() print next_siblings
同样,也可以使用 find_previous_siblings() 和 find_previous_sibling() 方法来搜索上一个同级的标签。
搜索下一个标签
使用 find_next() 方法将搜索下一个标签中第一个出现的,而 find_next_all() 将会返回所有下级的标签项。
# 搜索下一级标签
first_div = soup.div
all_li_tags = first_div.find_all_next("li")
print all_li_tags
搜索上一个标签
与搜索下一个标签类似,使用 find_previous() 和 find_all_previous() 方法来搜索上一个标签。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家学习或者使用python能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。
# python
# beautifulsoup
# beautifulsoup模块
# 搜索li
# Python利用Beautiful Soup模块创建对象详解
# Python利用Beautiful Soup模块修改内容方法示例
# python BeautifulSoup使用方法详解
# Python中使用Beautiful Soup库的超详细教程
# python 解析html之BeautifulSoup
# Python BeautifulSoup中文乱码问题的2种解决方法
# python利用beautifulSoup实现爬虫
# python基于BeautifulSoup实现抓取网页指定内容的方法
# python使用beautifulsoup从爱奇艺网抓取视频播放
# Python使用BeautifulSoup库解析HTML基本使用教程
# 第一个
# 自定义
# 方法来
# 可以使用
# 还可以
# 多个
# 也能
# 我们可以
# 情况下
# 这个时候
# 正则表达式
# 所示
# 都是
# 就会
# 是个
# 会有
# 将会
# 两种
# 开了
# 类属
相关文章:
宿州网站制作公司兴策,安徽省低保查询网站?
在线ppt制作网站有哪些,请推荐几个好的课件下载的网站?
网站制作报价单模板图片,小松挖机官方网站报价?
javascript中的try catch异常捕获机制用法分析
深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?
香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化
深圳网站制作的公司有哪些,dido官方网站?
代刷网站制作软件,别人代刷火车票靠谱吗?
家庭建站与云服务器建站,如何选择更优?
建站之星伪静态规则如何正确配置?
高端企业智能建站程序:SEO优化与响应式模板定制开发
建站之星如何防范黑客攻击与数据泄露?
实例解析angularjs的filter过滤器
专业网站制作企业网站,如何制作一个企业网站,建设网站的基本步骤有哪些?
矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?
购物网站制作公司有哪些,哪个购物网站比较好?
一键制作网站软件下载安装,一键自动采集网页文档制作步骤?
佛山网站制作系统,佛山企业变更地址网上办理步骤?
免费网站制作模板下载,除了易企秀之外还有什么H5平台可以制作H5长页面,最好是免费的?
学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?
合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?
如何用美橙互联一键搭建多站合一网站?
如何制作一个表白网站视频,关于勇敢表白的小标题?
长春网站建设制作公司,长春的网络公司怎么样主要是能做网站的?
如何在Windows服务器上快速搭建网站?
七夕网站制作视频,七夕大促活动怎么报名?
建站主机如何选?性能与价格怎样平衡?
Android自定义listview布局实现上拉加载下拉刷新功能
网站制作公司排行榜,四大门户网站排名?
建站之星logo尺寸如何设置最合适?
,交易猫的商品怎么发布到网站上去?
相册网站制作软件,图片上的网址怎么复制?
建站主机是否等同于虚拟主机?
如何选择服务器才能高效搭建专属网站?
c++如何打印函数堆栈信息_c++ backtrace函数与符号名解析【方法】
兔展官网 在线制作,怎样制作微信请帖?
如何自定义建站之星模板颜色并下载新样式?
常州自助建站费用包含哪些项目?
如何用PHP快速搭建CMS系统?
制作旅游网站html,怎样注册旅游网站?
黑客如何利用漏洞与弱口令入侵网站服务器?
如何用好域名打造高点击率的自主建站?
常州自助建站工具推荐:低成本搭建与模板选择技巧
独立制作一个网站多少钱,建立网站需要花多少钱?
如何在建站之星绑定自定义域名?
如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?
如何基于云服务器快速搭建网站及云盘系统?
建站主机默认首页配置指南:核心功能与访问路径优化
XML的“混合内容”是什么 怎么用DTD或XSD定义
美食网站链接制作教程视频,哪个教做美食的网站比较专业点?
*请认真填写需求信息,我们会在24小时内与您取得联系。