Python利用Beautiful Soup模块搜索内容详解
来源:
中文源码网 浏览:362 次 日期:2024-05-02 07:22:31
【下载文档: Python利用Beautiful Soup模块搜索内容详解.txt 】
Python利用Beautiful Soup模块搜索内容详解
前言
我们将利用 Beautiful Soup 模块的搜索功能,根据标签名称、标签属性、文档文本和正则表达式来搜索。
搜索方法
Beautiful Soup 内建的搜索方法如下:
find()
find_all()
find_parent()
find_parents()
find_next_sibling()
find_next_siblings()
find_previous_sibling()
find_previous_siblings()
find_previous()
find_all_previous()
find_next()
find_all_next()
使用 find() 方法搜索
首先还是需要建立一个 HTML 文件用来做测试。
我们可以通过 find() 方法来获得
标签,默认情况下会得到第一个出现的。接着再获取 - 标签,默认情况下还是会得到第一个出现的,接着获得
标签,通过输出内容来验证是否获取了第一个出现的标签。
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() 方法充当过滤器,提高匹配结果的精确度。
搜索标签
除了上面代码的搜索
标签外,我们还可以搜索 - 标签,返回结果也是返回出现的第一个匹配内容。
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)
返回的结果也是 NavigableString 对象 。
根据正则表达式搜索
如下的一段 HTML 文本内容
The below HTML has the information that has email ids.
abc@example.com
xyz@example.com
foo@example.com
可以看到 abc@example 邮件地址并没有包括在任何标签内,这样就不能根据标签来找到邮件地址了。这个时候,我们可以使用正则表达式来进行匹配。
email_id_example = """
The below HTML has the information that has email ids.
abc@example.com
xyz@example.com
foo@example.com
"""
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 。
但是对以下两种情况会有不同:
自定义属性
类 ( class ) 属性
我们不能再直接使用属性值来搜索了,而是得使用 attrs 参数来传递给 find() 函数。
根据自定义属性来搜索
在 HTML5 中是可以给标签添加自定义属性的,例如给标签添加 属性。
如下代码所示,如果我们再像搜索 id 那样进行操作的话,会报错的,Python 的变量不能包括 - 符号。
customattr = """
custom attribute example
"""
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 = """
Example of p tag with class identical
Example of div tag with class identical
"""
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能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对中文源码网的支持。
- • 在unittest中使用 logging 模块记录测试数据的方法
- • 在pytorch中为Module和Tensor指定GPU的例子
- • 在Pytorch中使用样本权重(sample_weight)的正确方法
- • 在pytorch中查看可训练参数的例子
- • 在PyTorch中Tensor的查找和筛选例子
- • 在Python中合并字典模块ChainMap的隐藏坑【推荐】
- • 在Python中关于使用os模块遍历目录的实现方法
- • 在python中pandas读文件,有中文字符的方法
- • 在python中pandas的series合并方法
- • 在Python中pandas.DataFrame重置索引名称的实例
- • 在Pandas中给多层索引降级的方法
- • 在Pandas中处理NaN值的方法
- • 在Pandas中DataFrame数据合并,连接(concat,merge,join)的实例
- • 在pandas多重索引multiIndex中选定指定索引的行方法
- • 用于业余项目的8个优秀Python库
- • 用scikit-learn和pandas学习线性回归的方法
- • 用Python中的turtle模块画图两只小羊方法
- • 用python生成(动态彩色)二维码的方法(使用myqr库实现)
- • 用python标准库difflib比较两份文件的异同详解
- • 一看就懂得Python的math模块
- • 详细介绍pandas的DataFrame的append方法使用
- • 详解将Pandas中的DataFrame类型转换成Numpy中array类型的三种方法
- • 详解python中的模块及包导入
- • 详解python中的Turtle函数库
- • 详解python中的hashlib模块的使用
- • 详解Python中pandas的安装操作说明(傻瓜版)
- • 详解python之heapq模块及排序操作
- • 详解Python学习之安装pandas
- • 详解Python数据分析--Pandas知识点
- • 详解python使用turtle库来画一朵花
- • 详解python使用pip安装第三方库(工具包)速度慢、超时、失败的解决方案
- • 详解Python基础random模块随机数的生成
- • 详解python的argpare和click模块小结
- • 详解python:time模块用法
- • 详解Python_shutil模块
- • 详解Python3 pandas.merge用法
- • 详解Python 正则表达式模块
- • 详解python pandas 分组统计的方法
- • 详解python 3.6 安装json 模块(simplejson)
- • 详解pyenv下使用python matplotlib模块的问题解决
- • 详解pandas中MultiIndex和对象实际索引不一致问题
- • 详解Pandas之容易让人混淆的行选择和列选择
- • 详解pandas数据合并与重塑(pd.concat篇)
- • 详解pandas使用drop_duplicates去除DataFrame重复项参数
- • 详解pandas删除缺失数据(pd.dropna()方法)
- • 详解pandas如何去掉、过滤数据集中的某些值或者某些行?
- • 详解pandas库pd.read_excel操作读取excel文件参数整理与实例
- • 详解pandas的外部数据导入与常用方法
- • 详解pandas安装若干异常及解决方案总结
- • 详解pandas.DataFrame中删除包涵特定字符串所在的行
- • 详解PANDAS 数据合并与重塑(join_merge篇)
- • 详解pandas DataFrame的查询方法(loc,iloc,at,iat,ix的用法和区别)
- • 使用urllib库的urlretrieve()方法下载网络文件到本地的方法
- • 使用Python的toolz库开始函数式编程的方法
- • 使用Python的SymPy库解决数学运算问题的方法
- • 使用python的pexpect模块,实现远程免密登录的示例
- • 使用python的pandas为你的股票绘制趋势图
- • 使用Python的OpenCV模块识别滑动验证码的缺口(推荐)
- • 使用python PIL库实现简单验证码的去噪方法步骤
- • 使用Python Pandas处理亿级数据的方法
- • 使用python os模块复制文件到指定文件夹的方法
- • 使用pip安装python库的多种方式
- • 使用pandas实现csv_excel sheet互相转换的方法
- • 使用Pandas对数据进行筛选和排序的实现
- • 使用pandas读取文件的实现
- • 使用pandas把某一列的字符值转换为数字的实例
- • 实例详解Python模块decimal
- • 十分钟搞定pandas(入门教程)
- • 如何使用Python标准库进行性能测试
- • 让代码变得更易维护的7个Python库
- • 浅谈Python小波分析库Pywavelets的一点使用心得
- • 浅谈python标准库--functools.partial
- • 浅谈python 导入模块和解决文件句柄找不到问题
- • 浅谈pandas用groupby后对层级索引levels的处理方法
- • 浅谈pandas筛选出表中满足另一个表所有条件的数据方法
- • 浅谈Pandas_Series和DataFrame间的算术元素
- • 浅谈Pandas Series 和 Numpy array中的相同点
- • 连接pandas以及数组转pandas的方法
- • 利用Python库Scapy解析pcap文件的方法
- • 利用python-docx模块写批量生日邀请函
- • 利用python GDAL库读写geotiff格式的遥感影像方法
- • 利用Pandas和Numpy按时间戳将数据以Groupby方式分组
- • 利用ImageAI库只需几行python代码实现目标检测
- • 利用anaconda作为python的依赖库管理方法
- • 举例讲解Python常用模块
- • 解决安装python库时windows error5 报错的问题
- • 解决Python中pandas读取_.csv文件出现编码问题
- • 解决Python找不到ssl模块问题 No module named _ssl的方法
- • 解决python通过cx_Oracle模块连接Oracle乱码的问题
- • 解决Python pandas plot输出图形中显示中文乱码问题
- • 解决python Markdown模块乱码的问题
- • 解决pycharm每次新建项目都要重新安装一些第三方库的问题
- • 解决Pycharm 包已经下载,但是运行代码提示找不到模块的问题
- • 解决Pandas的DataFrame输出截断和省略的问题
- • 解决pandas.DataFrame.fillna 填充Nan失败的问题
- • 解决pandas .to_excel不覆盖已有sheet的问题
- • 将pandas.dataframe的数据写入到文件中的方法
- • 简单了解python 邮件模块的使用方法
- • 基于Python的PIL库学习详解
- • 基于pycharm导入模块显示不存在的解决方法
- • 关于python导入模块import与常见的模块详解
- • 关于pymysql模块的使用以及代码详解
- • 更新修改后的Python模块方法
- • 对python中的six.moves模块的下载函数urlretrieve详解
- • 对Python中TKinter模块中的Label组件实例详解
- • 对Python信号处理模块signal详解
- • 对python添加模块路径的三种方法总结
- • 对python模块中多个类的用法详解
- • 对Python模块导入时全局变量__all__的作用详解
- • 对python3中pathlib库的Path类的使用详解
- • 对python3标准库httpclient的使用详解
- • 对Python random模块打乱数组顺序的实例讲解
- • 对Python Pexpect 模块的使用说明详解
- • 对python pandas读取剪贴板内容的方法详解
- • 对python pandas 画移动平均线的方法详解
- • 对python csv模块配置分隔符和引用符详解
- • 对pandas中时间窗函数rolling的使用详解
- • 对pandas中两种数据类型Series和DataFrame的区别详解
- • 对pandas中iloc,loc取数据差别及按条件取值的方法详解
- • 对pandas写入读取h5文件的方法详解