Beautiful Soup

简介

简单来说,Beautiful Soup是python的一个库,最主要的功能是从网页抓取数据。官方解释如下:

'''
Beautiful Soup提供一些简单的、python式的函数用来处理导航、搜索、修改分析树等功能。
它是一个工具箱,通过解析文档为用户提供需要抓取的数据,因为简单,所以不需要多少代码就可以写出一个完整的应用程序。
'''

Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式.Beautiful Soup会帮你节省数小时甚至数天的工作时间.你可能在寻找 Beautiful Soup3 的文档,Beautiful Soup 3 目前已经停止开发,官网推荐在现在的项目中使用Beautiful Soup 4。

安装

pip install beautifulsoup4

解析器

Beautiful Soup支持Python标准库中的HTML解析器,还支持一些第三方的解析器,如果我们不安装它,则 Python 会使用 Python默认的解析器

lxml 解析器更加强大,速度更快,推荐安装。

pip install lxml

另一个可供选择的解析器是纯Python实现的 html5lib , html5lib的解析方式与浏览器相同,可以选择下列方法来安装html5lib:

pip install html5lib

解析器对比:

BeautifulSoup使用

BS导入

1. 导包:from bs4 import BeautifulSoup
2. 可以将一个html文档,转化为BeautifulSoup对象,然后通过对象的方法或者属性去查找指定的节点内容
2.1 本地文件:soup = BeautifulSoup(open('本地文件'), 'lxml') 2.2 网络数据:soup = BeautifulSoup('字符串类型或者字节类型', 'lxml')

属性

<1>根据标签名查找
- soup.a 只能找到第一个符合要求的标签,返回标签

<2>获取属性
- soup.a.attrs 返回一个字典,获取a所有的属性和属性值
- soup.a.attrs['href'] 获取href属性
- soup.a['href'] 也可简写为这种形式

<3>获取内容
- soup.a.string
- soup.a.text
- soup.a.get_text() 与text无区别
【注意】如果标签还有标签,那么string获取到的结果为None,而其它两个,可以获取文本内容

<4>find:找到第一个符合要求的标签
- soup.find('a') 找到第一个符合要求的
- soup.find('a', title="xxx")
- soup.find('a', alt="xxx")
- soup.find('a', class_="xxx")
- soup.find('a', id="xxx")

<5>find_all:找到所有符合要求的标签
- soup.find_all('a')
- soup.find_all(['a','b']) 找到所有的a和b标签
- soup.find_all('a', limit=2) 限制前两个

<6>根据选择器选择指定的内容
select:soup.select('#feng')
- 常见的选择器:标签选择器(a)、类选择器(.)、id选择器(#)、层级选择器
- 层级选择器:
div .dudu #lala .meme .xixi 下面好多级
div > p > a > .lala 只能是下面一级
【注意】select选择器返回永远是列表,需要通过下标提取指定的对象

方法

doc = """
<html><head><title>The Dormouse's story</title></head>
<body>
<p id="my p" class="title"><b id="bbb" class="boldest">The Dormouse's story</b>
</p> <p class="story">Once upon a time there were three little sisters; and their names were
<a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>,
<a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
<a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
and they lived at the bottom of a well.</p> <p class="story">...</p>
"""

测试数据

find_all()

  • 找到所有符合要求的标签
  • 返回一个列表
  • find_all(name=None, attrs={}, recursive=True, text=None,limit=None, **kwargs)

1 name

五种过滤器:字符串、正则表达式、列表、True和方法

# 字符串:即标签名
print(soup.find_all('b')) # [<b class="boldest" id="bbb">The Dormouse's story</b>] # 正则表达式
print(soup.find_all(re.compile("^b"))) # 找出b开头的标签,结果有body和b标签 # 列表:如果传入列表参数,BeautifulSoup会与列表中任一元素匹配的内容返回
print(soup.find_all(['a', 'b'])) # 找到文档中所有<a>标签和<b>标签 # True: 可以匹配任何值
print(soup.find_all(True)) # 找出所有的tag
for tag in soup.find_all(True):
print(tag.name) # html head title body p b p a a a p # 方法: 如果没有合适过滤器,可以定义一个方法,方法只接受一个元素参数,如果这个方法返回True, 表示当前元素匹配并且被找到,如果不是则返回False
def has_class_but_no_id(tag):
return tag.has_attr('class') and not tag.has_attr('id')
print(soup.find_all(has_class_but_no_id))

2 按照类名查找

class关键字为class_, class_=value,value可以是五种选择器之一

print(soup.find_all('a', class_='sister'))  # 查找class为sister的a标签
print(soup.find_all('a', id='link3')) # 查找id为link3的a标签

3 attrs

print(soup.find_all('p', attrs={'class': 'story'}))  # 查找class为story的p标签

4 text

值可以是字符、列表、True和正则

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

5 limit

限制返回结果的数量

print(soup.find_all('a', limit=2))

6 recursive

默认为True,即搜索当前tag的所有子孙节点,如果只想搜索tag的直接子节点,可以使用参数recursive=False
print(soup.html.find_all('a'))
# 局部查找
print(soup.html.find_all('a', recursive=False))

find()

  • find()参数与和find_all完全一样
  • soup.find('a') 等同于soup.a,只能找到每一个符合要求的标签

selector选择器

selector等同于css选择器

返回列表

print(soup.select('.sister'))  # 查找class为sister的标签
print(soup.select("#link2")) # 查找id为link2的标签
print(soup.select('.c1 a')) # 查找class为c1标签下的a标签

最新文章

  1. 面向初学者之烦人的mainactivity启动前的actionBAR
  2. JDBC判断数据库是否插入成功
  3. 利用js来实现文字的滚动(也就是我们常常见到的新闻版块中的公示公告)
  4. 日期对象-Date
  5. 修改/etc/profile导致常用命令不可用的解决办法
  6. 【POJ3237】Tree 树链剖分+线段树
  7. C语言与水仙花数
  8. java.lang.ClassNotFoundException: Didn&#39;t find class &quot;*****(转载)
  9. nullcon HackIM 2016 -- Programming Question 1
  10. C# 通过消息捕获处理窗体最大化/最小化
  11. VIM键盘快捷键映射
  12. Linux 7 中Yum 配置 说明
  13. HTML5学习笔记&lt;五&gt;: HTML表单和PHP环境搭建
  14. 安装阿里Java代码规约插件
  15. idea编译时JDK版本变化
  16. mysql学习笔记02 CRUD操作
  17. laravel之知识点
  18. 关于linux系统CPU篇---&gt;上下文切换
  19. Pandas字符串操作及实例应用
  20. linux系统中不同颜色的文件夹及根目录介绍

热门文章

  1. 数位dp真&#183;浅谈 By cellur925
  2. Queue Sequence HDU - 4441
  3. HDOJ 5475 An easy problem
  4. vue+typescript入门学习
  5. Could not open logfile&quot; occurred when run &quot;datapatch -verbose&quot;
  6. jQuery在$(function(){})中調用函數
  7. AJPFX浅谈Java 性能优化之字符串过滤实战
  8. Git使用简析
  9. LNMP笔记:解决mail函数不能发送邮件
  10. xcopy递归拷贝