介绍及安装

Beautiful Soup 是一个HTML/XML的解析器,主要的功能也是如何解析和提取 HTML/XML 数据。

BeautifulSoup 用来解析 HTML 比较简单,API非常人性化,支持CSS选择器、Python标准库中的HTML解析器,也支持 lxml 的 XML解析器。

Beautiful Soup 3 目前已经停止开发,推荐现在的项目使用Beautiful Soup 4。使用 pip 安装即可:pip install beautifulsoup4

四大对象种类

Beautiful Soup将复杂HTML文档转换成一个复杂的树形结构,每个节点都是Python对象,所有对象可以归纳为4种:

  • Tag
  • NavigableString
  • BeautifulSoup
  • Comment

1.Tag

Tag 通俗点讲就是 HTML 中的一个个标签。

  1. print(soup.p)
  2. # <p class="title" name="dromouse"><b>The Dormouse's story</b></p>
  3. print(type(soup.p))
  4. # <class 'bs4.element.Tag'>

我们可以利用 soup 加标签名轻松地获取这些标签的内容,这些对象的类型是bs4.element.Tag。

对于 Tag,它有两个重要的属性,是 name 和 attrs.

  1. print(soup.name)
  2. # [document] soup 对象本身比较特殊,它的 name 即为 [document]
  3. print(soup.head.name)
  4. # head 对于其他内部标签,输出的值便为标签本身的名称
  5. print(soup.p.attrs)
  6. # {'class': ['title'], 'name': 'dromouse'}
  7. print(soup.p['class'])
  8. # ['title']

NavigableString

NavigableString简单来讲就是一个可以遍历的字符串。

例如:

  1. print(soup.p.string)
  2. # The Dormouse's story
  3. print(type(soup.p.string))
  4. # <class 'bs4.element.NavigableString'>

搜索文档

Beautiful Soup定义了很多搜索方法,这里着重介绍2个: find() 和 find_all() .其它方法的参数和用法类似。

  1. html_doc = """
  2. <html><head><title>The Dormouse's story</title></head>
  3. <p class="title"><b>The Dormouse's story</b></p>
  4. <p class="story">Once upon a time there were three little sisters; and their names were
  5. <a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>,
  6. <a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
  7. <a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
  8. and they lived at the bottom of a well.</p>
  9. <p class="story">...</p>
  10. """
  11. from bs4 import BeautifulSoup
  12. soup = BeautifulSoup(html_doc)

使用find_all等类似的方法可以查找想要的文档内容。

在介绍find_all方法之前,先介绍一下过滤器的类型。

字符串

最简单的过滤器是字符串。在搜索方法中传入一个字符串参数,BeautifulSoup会查找与字符串完整匹配的内容。

例如:

  1. 查找所有的b标签。
  2. soup.find_all('b')
  3. # [<b>The Dormouse's story</b>]

正则表达式

find_all方法可以接受正则表示式作为参数,BeautifulSoup会通过match方法来匹配内容。

  1. 匹配以b开头的标签
  2. for tag in soup.find_all(re.compile('^b')):
  3. print(tag.name)
  4. # body b
  5. 匹配包含t的标签
  6. for tag in soup.find_all(re.compile('t')):
  7. print(tag.name)
  8. # html title

列表

find_all方法也能接受列表参数,BeautifulSoup会将与列表中任一元素匹配的内容返回。

  1. 查找a标签和b标签
  2. for tag in soup.find_all(['a','b']):
  3. print(tag.name)
  4. # b a a a

方法

如果没有合适的过滤器,我们也可以自己定义一个方法,方法只接受一个元素参数。

  1. 匹配包含class属性,但是不包括id属性的标签。
  2. def has_class_but_no_id(tag):
  3. return tag.has_attr('class') and not tag.has_attr('id')
  4. print([tag.name for tag in soup.find_all(has_class_but_no_id)])
  5. # ['p','p','p']

css选择器

这就是另一种与 find_all 方法有异曲同工之妙的查找方法.

  • 写 CSS 时,标签名不加任何修饰,类名前加.,id名前加#

  • 在这里我们也可以利用类似的方法来筛选元素,用到的方法是 soup.select(),返回类型是 list

1.通过标签名查找

  1. print(soup.select('title'))
  2. #[<title>The Dormouse's story</title>]
  3. print(soup.select('a'))
  4. #[<a class="sister" href="http://example.com/elsie" id="link1"><!-- Elsie --></a>, <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>, <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]
  5. print(soup.select('b'))
  6. #[<b>The Dormouse's story</b>]

2.通过类名查找

  1. print(soup.select('.sister'))
  2. #[<a class="sister" href="http://example.com/elsie" id="link1"><!-- Elsie --></a>, <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>, <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]

3.通过 id 名查找

  1. print(soup.select('#link1'))
  2. #[<a class="sister" href="http://example.com/elsie" id="link1"><!-- Elsie --></a>]

4.组合查找

组合查找即和写 class 文件时,标签名与类名、id名进行的组合原理是一样的,例如查找 p 标签中,id 等于 link1的内容,二者需要用空格分开

  1. print(soup.select('p #link1'))
  2. #[<a class="sister" href="http://example.com/elsie" id="link1"><!-- Elsie --></a>]
  3. 直接子标签查找,则使用 > 分隔
  4. print(soup.select("head > title"))
  5. #[<title>The Dormouse's story</title>]

5.属性查找

查找时还可以加入属性元素,属性需要用中括号括起来,注意属性和标签属于同一节点,所以中间不能加空格,否则会无法匹配到。

  1. print(soup.select('a[class="sister"]'))
  2. #[<a class="sister" href="http://example.com/elsie" id="link1"><!-- Elsie --></a>, <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>, <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]
  3. print(soup.select('a[href="http://example.com/elsie"]'))
  4. #[<a class="sister" href="http://example.com/elsie" id="link1"><!-- Elsie --></a>]
  5. 同样,属性仍然可以与上述查找方式组合,不在同一节点的空格隔开,同一节点的不加空格
  6. print(soup.select('p a[href="http://example.com/elsie"]'))
  7. #[<a class="sister" href="http://example.com/elsie" id="link1"><!-- Elsie --></a>]

6.获取内容

以上的 select 方法返回的结果都是列表形式,可以遍历形式输出,然后用 get_text() 方法来获取它的内容。

  1. soup = BeautifulSoup(html, 'lxml')
  2. print(type(soup.select('title')))
  3. print(soup.select('title')[0].get_text())
  4. for title in soup.select('title'):
  5. print(title.get_text())

===============================================================================================

  1. 通过tag标签逐层查找:
  2. soup.select("body a")
  3. 找到某个tag标签下的直接子标签
  4. soup.select("head > title")
  5. 通过CSS的类名查找:
  6. soup.select(".sister")
  7. 通过tagid查找:
  8. soup.select("#link1")
  9. 通过是否存在某个属性来查找:
  10. soup.select('a[href]')
  11. 通过属性的值来查找:
  12. soup.select('a[href="http://example.com/elsie"]')

网页解析之BeautifulSoup的更多相关文章

  1. 转:Python网页解析:BeautifulSoup vs lxml.html

    转自:http://www.cnblogs.com/rzhang/archive/2011/12/29/python-html-parsing.html Python里常用的网页解析库有Beautif ...

  2. 关于爬虫中常见的两个网页解析工具的分析 —— lxml / xpath 与 bs4 / BeautifulSoup

    http://www.cnblogs.com/binye-typing/p/6656595.html 读者可能会奇怪我标题怎么理成这个鬼样子,主要是单单写 lxml 与 bs4 这两个 py 模块名可 ...

  3. 【Python爬虫】BeautifulSoup网页解析库

    BeautifulSoup 网页解析库 阅读目录 初识Beautiful Soup Beautiful Soup库的4种解析器 Beautiful Soup类的基本元素 基本使用 标签选择器 节点操作 ...

  4. 第6章 网页解析器和BeautifulSoup第三方插件

    第一节 网页解析器简介作用:从网页中提取有价值数据的工具python有哪几种网页解析器?其实就是解析HTML页面正则表达式:模糊匹配结构化解析-DOM树:html.parserBeautiful So ...

  5. 网页解析:Xpath 与 BeautifulSoup

    1. Xpath 1.1 Xpath 简介 1.2 Xpath 使用案例 2. BeautifulSoup 2.1 BeautifulSoup 简介 2.2 BeautifulSoup 使用案例 1) ...

  6. Beautifulsoup网页解析——爬取豆瓣排行榜分类接口

    我们在网页爬取的过程中,会通过requests成功的获取到所需要的信息,而且,在返回的网页信息中,也是通过HTML代码的形式进行展示的.HTML代码都是通过固定的标签组合来实现页面信息的展示,所以,最 ...

  7. Python网页解析

    续上篇文章,网页抓取到手之后就是解析网页了. 在Python中解析网页的库不少,我最开始使用的是BeautifulSoup,貌似这个也是Python中最知名的HTML解析库.它主要的特点就是容错性很好 ...

  8. 【爬虫入门手记03】爬虫解析利器beautifulSoup模块的基本应用

    [爬虫入门手记03]爬虫解析利器beautifulSoup模块的基本应用 1.引言 网络爬虫最终的目的就是过滤选取网络信息,因此最重要的就是解析器了,其性能的优劣直接决定这网络爬虫的速度和效率.Bea ...

  9. Python HTML解析器BeautifulSoup(爬虫解析器)

    BeautifulSoup简介 我们知道,Python拥有出色的内置HTML解析器模块——HTMLParser,然而还有一个功能更为强大的HTML或XML解析工具——BeautifulSoup(美味的 ...

随机推荐

  1. Cannot read property 'forEach' of undefined

    在singer-detail组件中,有一个_normalizeSongs()方法,遍历数组 _normalizeSongs(list) { let ret = []; list.forEach(ite ...

  2. Mui 长按保存图片

    必须先要 引入 mui.js,然后参考具体代码 <!DOCTYPE html> <html> <head> <meta charset="utf-8 ...

  3. Java 并发编程(四):如何保证对象的线程安全性

    01.前言 先让我吐一句肺腑之言吧,不说出来会憋出内伤的.<Java 并发编程实战>这本书太特么枯燥了,尽管它被奉为并发编程当中的经典之作,但我还是忍不住.因为第四章"对象的组合 ...

  4. vue H5页面手机端 利用canvas 签名

    签名首先用一个canvas标签,上面加三个代码,分别是点击,移动,离开.这里点击是开始画笔的地方,如果不加@touchstart 笔头会发生偏移,可以试试. @toucheend也是如此.尾巴也会出现 ...

  5. vi文本编辑器命令

    基本上 vi 共分为三种模式,分别是『一般模式』.『编辑模式』与『指令列命令模式』. 这三种模式的作用分别是: 一般模式:以 vi 打开一个档案就直接进入一般模式了(这是默认的模式).在这个模式中, ...

  6. 修改tomcat默认使用的jdk版本

    1.windows平台 在csetclasspath.bat文件开头加上如下两句(指定JDK): set JAVA_HOME=C:\Program Files\Java\jdk1.7.0_79  se ...

  7. ThinkPHP5.1 反序列化利用链

    笔记里直接复制出来的   1 composer直接获取框架代码   ➜  composer create-project --prefer-dist topthink/think tp5137 ➜  ...

  8. JVM性能调优详解

    前面我们学习了整个JVM系列,最终目标的不仅仅是了解JVM的基础知识,也是为了进行JVM性能调优做准备.这篇文章带领大家学习JVM性能调优的知识. 性能调优 性能调优包含多个层次,比如:架构调优.代码 ...

  9. SSHD服务安全的连接

    SSHD服务 SSH 安全的远程连接 OpenSSH 工具 centos服务端的包:openssh-server centos客户端的包:openssh-clients 主要配置文件一般安装完成后再/ ...

  10. Hadoop3.2.1版本的环境搭建

    最近有人提出能不能发一些大数据相关的知识,No problem ! 今天先从安装环境说起,搭建起自己的学习环境. Hadoop的三种搭建方式以及使用环境: 单机版适合开发调试: 伪分布式适合模拟集群学 ...