前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python-数据解析-Beautiful Soup-中

Python-数据解析-Beautiful Soup-中

作者头像
小团子
发布2019-07-18 15:13:26
1.2K0
发布2019-07-18 15:13:26
举报
文章被收录于专栏:数据云团
代码语言:javascript
复制
from bs4 import BeautifulSoup
soup = BeautifulSoup(html_doc, 'lxml')

一、通过操作方法进行解读搜索

网页中有用的信息都存在于网页中的文本或者各种不同标签的属性值,为了能获取这些有用的网页信息,可以通过一些查找方法获取文本或者标签属性。

find() 方法:

用于查找符合查询条件的第一个标签节点。

find_all() 方法:

查找所有符合查询条件的标签节点,并返回一个列表。

代码语言:javascript
复制
find_all(self, name=None, attrs={}, recursive=True, text=None, limit=None, **kwargs)

① name 参数

查找所有名字为 name 的标签,但字符串会被自动忽略。

  • 传入字符串:

在搜索的方法中传入一个字符串,BeautifulSoup 对象会查找与字符串完全匹配的内容。

代码语言:javascript
复制
# 查找文档中所有的 <b> 标签
soup.find_all('b')
  • 传入正则表达式:

如果传入一个正则表达式,那么 BeautifulSoup 对象会通过 re 模块的 match() 函数进行匹配。

代码语言:javascript
复制
# 使用正则表达式 “^b” 匹配所有以字母 b 开头的标签
import re
for tag in soup.find_all(re.compile("^b")):
  print(tag.name) 
  • 传入列表:

如果是传入一个列表,那么 BeautifulSoup 对象会将与列表中任一元素匹配的内容返回。

代码语言:javascript
复制
# 找到文档中所有的 <a> 标签和 <b> 标签
soup.find_all(["a", "b"])

② attrs 参数

如果某个指定名字的参数不是搜索方法中内置的参数名,那么在进行搜索时,会把该参数当作指定名称的标签中的属性来搜索。

代码语言:javascript
复制
# 在 find_all() 方法中传入名称为 id 的参数,BeautifulSoup对象会搜索每个标签的 id 属性
soup.find_all(id="active")

如果传入多个指定名字的参数,则可以同时过滤出标签中的多个属性。

代码语言:javascript
复制
# 搜索每个标签的 id 属性,又可以搜索 href 属性
import re
soup.find_all(href=re.compile('com'), id="submit-btn")
代码语言:javascript
复制
# 搜索的标签名称为 class
soup.find_all("a", class_="btn")

由于 class 属于 Python 的关键字,所以在 class 的后面加上一个下划线 class_。

有些标签的属性名称是不能使用的,在 HTML5 中的 “data-” 属性,在程序中使用时,会出现 SyntaxError 异常信息。

可以通过 find_all() 方法的 attrs 参数传入一个字典来搜索包含特殊属性的标签。

代码语言:javascript
复制
data_soup = BeautifulSoup("<div data-value="key">value</div>", "lxml")
data_soup.find_all(attrs={"data-value": "key"})

③ text 参数

通过在 find_all() 方法中传入 text 参数,可以搜索文档中的字符串内容。text 参数也可以接受字符串、正则表达式和列表。

代码语言:javascript
复制
soup.find_all(text="value")

soup.find_all(text=["active", "value", "key"])

④ limit 参数

使用 limit 参数限制返回结果的数量。

代码语言:javascript
复制
soup.find_all("a", limit=5)

⑤ recursive 参数

在调用 find_all() 方法时,BeautifulSoup 对象会检索当前节点的所有子节点。如果只想搜索当前节点的直接子节点,就可以使用参数 recursive=False

代码语言:javascript
复制
soup.html.find_all("title", recursive=False)
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-03-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据云团 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档