详解BeautifulSoup获取特定标签下内容的方法


Posted in Python onDecember 07, 2020

以下是个人在学习beautifulSoup过程中的一些总结,目前我在使用爬虫数据时使用的方法的是:先用find_all()找出需要内容所在的标签,如果所需内容一个find_all()不能满足,那就用两个或者多个。接下来遍历find_all的结果,用get_txt()、get(‘href')、得到文本或者链接,然后放入各自的列表中。这样做有一个缺点就是txt的数据是一个单独的列表,链接的数据也是一个单独的列表,一方面不能体现这些数据之间的结构性,另一方面当想要获得更多的内容时,就要创建更多的空列表。

遍历所有标签:

soup.find_all('a')

找出所有页面中含有标签a的html语句,结果以列表形式存储。对找到的标签可以进一步处理,如用for对结果遍历,可以对结果进行purify,得到如链接,字符等结果。

# 创建空列表
links=[] 
txts=[]
tags=soup.find_all('a')
for tag in tags:
  links.append(tag.get('href')
  txts.append(tag.txt)         #或者txts.append(tag.get_txt())

得到html的属性名:

atr=[]
tags=soup.find_all('a')
for tag in tags:
  atr.append(tag.p('class')) # 得到a 标签下,子标签p的class名称

find_all()的相关用法实例:

实例来自BeautifulSoup中文文档

1. 字符串

最简单的过滤器是字符串.在搜索方法中传入一个字符串参数,Beautiful Soup会查找与字符串完整匹配的内容,下面的例子用于查找文档中所有的标签:

soup.find_all('b')
# [<b>The Dormouse's story</b>]

2.正则表达式

如果传入正则表达式作为参数,Beautiful Soup会通过正则表达式的 match() 来匹配内容.下面例子中找出所有以b开头的标签,这表示和标签都应该被找到:

import re
for tag in soup.find_all(re.compile("^b")):
  print(tag.name)
# body
# b

下面代码找出所有名字中包含”t”的标签:

for tag in soup.find_all(re.compile("t")):
  print(tag.name)
# html
# title

3.列表

如果传入列表参数,Beautiful Soup会将与列表中任一元素匹配的内容返回.下面代码找到文档中所有标签和标签:

soup.find_all(["a", "b"])
# [<b>The Dormouse's story</b>,
# <a class="sister" href="http://example.com/elsie" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" id="link1">Elsie</a>,
# <a class="sister" href="http://example.com/lacie" rel="external nofollow" rel="external nofollow" rel="external nofollow" id="link2">Lacie</a>,
# <a class="sister" href="http://example.com/tillie" rel="external nofollow" rel="external nofollow" rel="external nofollow" id="link3">Tillie</a>]

4.方法(自定义函数,传入find_all)

如果没有合适过滤器,那么还可以定义一个方法,方法只接受一个元素参数 [4] ,如果这个方法返回 True 表示当前元素匹配并且被找到,如果不是则反回 False
下面方法校验了当前元素,如果包含 class 属性却不包含 id 属性,那么将返回 True:

def has_class_but_no_id(tag):
  return tag.has_attr('class') and not tag.has_attr('id')```

返回结果中只有

标签没有标签,因为标签还定义了”id”,没有返回和,因为和中没有定义”class”属性.
下面代码找到所有被文字包含的节点内容:

from bs4 import NavigableString
def surrounded_by_strings(tag):
  return (isinstance(tag.next_element, NavigableString)
      and isinstance(tag.previous_element, NavigableString))

for tag in soup.find_all(surrounded_by_strings):
  print tag.name
# p
# a
# a
# a
# p

5.按照CSS搜索

按照CSS类名搜索tag的功能非常实用,但标识CSS类名的关键字 class 在Python中是保留字,使用 class 做参数会导致语法错误.从Beautiful Soup的4.1.1版本开始,可以通过 class_ 参数搜索有指定CSS类名的tag:

soup.find_all("a", class_="sister")
# [<a class="sister" href="http://example.com/elsie" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" id="link1">Elsie</a>,
# <a class="sister" href="http://example.com/lacie" rel="external nofollow" rel="external nofollow" rel="external nofollow" id="link2">Lacie</a>,
# <a class="sister" href="http://example.com/tillie" rel="external nofollow" rel="external nofollow" rel="external nofollow" id="link3">Tillie</a>]

或者:

soup.find_all("a", attrs={"class": "sister"})
# [<a class="sister" href="http://example.com/elsie" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" id="link1">Elsie</a>,
# <a class="sister" href="http://example.com/lacie" rel="external nofollow" rel="external nofollow" rel="external nofollow" id="link2">Lacie</a>,
# <a class="sister" href="http://example.com/tillie" rel="external nofollow" rel="external nofollow" rel="external nofollow" id="link3">Tillie</a>]

6.按照text参数查找

通过 text 参数可以搜搜文档中的字符串内容.与 name 参数的可选值一样, text 参数接受 字符串 , 正则表达式 , 列表, True . 看例子:

soup.find_all(text="Elsie")
# [u'Elsie']

soup.find_all(text=["Tillie", "Elsie", "Lacie"])
# [u'Elsie', u'Lacie', u'Tillie']

soup.find_all(text=re.compile("Dormouse"))
[u"The Dormouse's story", u"The Dormouse's story"]

def is_the_only_string_within_a_tag(s):
  ""Return True if this string is the only child of its parent tag.""
  return (s == s.parent.string)

soup.find_all(text=is_the_only_string_within_a_tag)
# [u"The Dormouse's story", u"The Dormouse's story", u'Elsie', u'Lacie', u'Tillie', u'...']

虽然 text 参数用于搜索字符串,还可以与其它参数混合使用来过滤tag.Beautiful Soup会找到 .string 方法与 text 参数值相符的tag.下面代码用来搜索内容里面包含“Elsie”的标签:

soup.find_all("a", text="Elsie")
# [<a href="http://example.com/elsie" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" class="sister" id="link1">Elsie</a>]

7.只查找当前标签的子节点

调用tag的 find_all() 方法时,Beautiful Soup会检索当前tag的所有子孙节点,如果只想搜索tag的直接子节点,可以使用参数 recursive=False .

一段简单的文档:

<html>
 <head>
 <title>
  The Dormouse's story
 </title>
 </head>
...

是否使用 recursive 参数的搜索结果:

soup.html.find_all("title")
# [<title>The Dormouse's story</title>]

soup.html.find_all("title", recursive=False)
# []

到此这篇关于详解BeautifulSoup获取特定标签下内容的方法的文章就介绍到这了,更多相关BeautifulSoup获取特定标签内容内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python中replace方法实例分析
Aug 20 Python
python字符串连接方法分析
Apr 12 Python
Python实现霍夫圆和椭圆变换代码详解
Jan 12 Python
python互斥锁、加锁、同步机制、异步通信知识总结
Feb 11 Python
python中plot实现即时数据动态显示方法
Jun 22 Python
python 使用正则表达式按照多个空格分割字符的实例
Dec 20 Python
python爬虫基础教程:requests库(二)代码实例
Apr 09 Python
Python 写了个新型冠状病毒疫情传播模拟程序
Feb 14 Python
django queryset 去重 .distinct()说明
May 19 Python
python爬虫把url链接编码成gbk2312格式过程解析
Jun 08 Python
python中numpy.empty()函数实例讲解
Feb 05 Python
关于Python中*args和**kwargs的深入理解
Aug 07 Python
使用BeautifulSoup4解析XML的方法小结
Dec 07 #Python
BeautifulSoup获取指定class样式的div的实现
Dec 07 #Python
用Python实现童年贪吃蛇小游戏功能的实例代码
Dec 07 #Python
Selenium+BeautifulSoup+json获取Script标签内的json数据
Dec 07 #Python
Python爬虫实战案例之爬取喜马拉雅音频数据详解
Dec 07 #Python
用python对excel查重
Dec 07 #Python
python3 通过 pybind11 使用Eigen加速代码的步骤详解
Dec 07 #Python
You might like
sourcesafe管理phpproj文件的补充说明(downmoon)
2009/04/11 PHP
分享精心挑选的23款美轮美奂的jQuery 图片特效插件
2012/08/14 Javascript
Javascript中的关键字和保留字整理
2014/10/16 Javascript
JavaScript返回网页中超链接数量的方法
2015/04/03 Javascript
使用Sticky组件实现带sticky效果的tab导航和滚动导航的方法
2016/03/22 Javascript
jQuery的实例及必知重要的jQuery选择器详解
2016/05/20 Javascript
jquery ajaxfileupload异步上传插件使用详解
2017/02/08 Javascript
js实现简单的手风琴效果
2017/02/27 Javascript
Bootstrap布局之栅格系统学习笔记
2017/05/04 Javascript
bootstrap模态框示例代码分享
2017/05/17 Javascript
JS实现预加载视频音频/视频获取截图(返回canvas截图)
2017/10/09 Javascript
mpvue实现小程序签到金币掉落动画(api实现)
2019/10/17 Javascript
vue项目使用.env文件配置全局环境变量的方法
2019/10/24 Javascript
react-native聊天室|RN版聊天App仿微信实例|RN仿微信界面
2019/11/12 Javascript
JavaScript设计模式--简单工厂模式定义与应用案例详解
2020/05/23 Javascript
在Python中用keys()方法返回字典键的教程
2015/05/21 Python
python获取一组数据里最大值max函数用法实例
2015/05/26 Python
对python实现模板生成脚本的方法详解
2019/01/30 Python
详解Django 时间与时区设置问题
2019/07/23 Python
python做接口测试的必要性
2019/11/20 Python
解决python中的幂函数、指数函数问题
2019/11/25 Python
python接口自动化如何封装获取常量的类
2019/12/24 Python
可视化pytorch 模型中不同BN层的running mean曲线实例
2020/06/24 Python
关于python3.7安装matplotlib始终无法成功的问题的解决
2020/07/28 Python
CSS3 对过渡(transition)进行调速以及延时
2020/10/21 HTML / CSS
德国最大的拼图在线商店:Puzzle.de
2016/12/17 全球购物
澳大利亚相机之家:Camera House
2017/11/30 全球购物
c/c++某大公司的两道笔试题
2014/02/02 面试题
销售业务实习自我鉴定
2013/09/23 职场文书
幼儿师范毕业生自荐信
2013/11/09 职场文书
后勤部长岗位职责
2013/12/14 职场文书
金融行业职业生涯规划范文
2014/01/17 职场文书
幼儿园教师奖惩制度
2014/02/01 职场文书
团日活动总结模板
2014/06/25 职场文书
2014年学校领导班子对照检查材料
2014/09/19 职场文书
工作简报怎么写
2015/07/21 职场文书