用Python解析HTML,BeautifulSoup使用简介

by cnDenis, http://cndenis.iteye.com, 2012年12月12日

Beautiful Soup,字面意思是美好的汤,是一个用于解析HTML文件的Python库。主页在 http://www.crummy.com/software/BeautifulSoup/ , 下载与安装无需啰嗦,这里就介绍一下它的使用吧。


装汤——Making the Soup

首先要把待解析的HTML装入BeautifulSoup。BeautifulSoup可以接受文件句柄或是字符串作为输入:

from bs4 import BeautifulSoup
fp = open("index.html")
soup1 = BeautifulSoup(fp)
soup2 = BeautifulSoup("<html>data</html>")

汤料——Soup中的对象

标签(Tag)

标签对应于HTML元素,也就是应于一对HTML标签以及括起来的内容(包括内层标签和文本),如:

soup = BeautifulSoup('<b class="boldest">Extremely bold</b>')
tag = soup.b

soup.b就是一个标签,soup其实也可以视为是一个标签,其实整个HTML就是由一层套一层的标签组成的。

名字(Name)

名字对应于HTML标签中的名字(也就是尖括号里的第一项)。每个标签都具有名字,标签的名字使用.name来访问,例如上例中,

tag.name == u'b'
soup.name == u'[document]'

属性(Atrriutes)

属性对应于HTML标签中的属性部分(也就是尖括号里带等号的那些)。标签可以有许多属性,也可以没有属性。属性使用类似于字典的形式访问,用方括号加属性名,例如上例中,

tag['class'] ==  u'boldest'

可以使用.attrs直接获得这个字典,例如,

tag.attrs == {u'class': u'boldest'}

文本(Text)

文本对应于HTML中的文本(也就是尖括号外的部分)。文件使用.text来访问,例如上例中,

tag.text ==  u'Extremely bold'

找汤料——Soup中的查找

解析一个HTML通常是为了找到感兴趣的部分,并提取出来。BeautifulSoup提供了findfind_all的方法进行查找。find只返回找到的第一个标签,而find_all则返回一个列表。因为查找用得很多,所以BeautifulSoup做了一些很方便的简化的使用方式:

tag.find_all("a")  #等价于 tag("a")
tag.find("a") #等价于 tag.a

因为找不到的话,find_all返回空列表,find返回None,而不会抛出异常,所以,也不用担心 tag("a")tag.a 会因为找不到而报错。限于python的语法对变量名的规定,tag.a 的形式只能是按名字查找,因为点号.后面只能接变量名,而带括号的形式 tag()tag.find() 则可用于以下的各种查找方式。

查找可以使用多种方式:字符串、列表、键-值(字典)、正则表达式、函数

  • 字符串: 字符串会匹配标签的名字,例如 tag.atag("a")

  • 列表: 可以按一个字符串列表查找,返回名字匹配任意一个字符串的标签。例如 tag("h2", "p")

  • 键-值: 可以用tag(key=value)的形式,来按标签的属性查找。键-值查找里有比较多的小花招,这里列几条:

    1. class
      class是Python的保留字,不能当变量名用,偏偏在HTML中会有很多 class=XXX 的情况,BeautifulSoup的解决方法是加一下划线,用 class_ 代替,如 tag(class_=XXX)
    2. True
      当值为True时,会匹配所有带这个键的标签,如 tag(href=True)
    3. text
      text做为键时表示查找按标签中的文本查找,如 tag(text=something)
  • 正则表达式: 例如 tag(href=re.compile("elsie"))

  • 函数: 当以上方法都行不通时,函数是终极方法。写一个以单个标签为参数的函数,传入 findfind_all 进行查找。如

    def fun(tag):return tag.has_key("class") and not tag.has_key("id")
    tag(fun) # 会返回所有带class属性但不带id属性的标签
    

再来一碗——按文档的结构查找

HTML可以解析成一棵标签树,因此也可以按标签在树中的相互关系来查找。

  • 查找上层节点:find_parents()find_parent()

  • 查找下一个兄弟节点:find_next_siblings()find_next_sibling()

  • 查找上一个兄弟节点:find_previous_siblings()find_previous_sibling()

以上四个都只会查同一父节点下的兄弟

  • 查找下层节点:其实上面说的find和find_all就是干这活的

  • 查找下一个节点(无视父子兄弟关系) find_all_next()find_next()

  • 查找上一个节点(无视父子兄弟关系) find_all_previous()find_previous()

以上的这些查找的参都和find一样,可以搭配着用。


看颜色选汤——按CSS查找

.select()方法,看 http://www.crummy.com/software/BeautifulSoup/bs4/doc/#css-selectors

一些小花招

  • BeautifulSoup 可以支持多种解析器,如lxml, html5lib, html.parser. 如:BeautifulSoup("<a></b>", "html.parser")

具体表现可参考 http://www.crummy.com/software/BeautifulSoup/bs4/doc/#differences-between-parsers

  • BeautifulSoup 在解析之前会先把文本转换成unicode,可以用 from_encoding 指定编码,如:BeautifulSoup(markup, from_encoding="iso-8859-8")

  • soup.prettify()可以输出排列得很好看的HTML文本,遇上中文的话可以指定编码使其显示正常,如 soup.prettify("gbk")

  • 还是有编码问题,看:http://www.crummy.com/software/BeautifulSoup/bs4/doc/#unicode-dammit

用Python解析HTML,BeautifulSoup使用简介相关推荐

  1. 硬核来袭!!!一篇文章教你入门Python爬虫网页解析神器——BeautifulSoup详细讲解

    文章目录 一.BeautifulSoup介绍 二.安装 三.bs4数据解析的原理 四.bs4 常用的方法和属性 1.BeautifulSoup构建 1.1 通过字符串构建 1.2 从文件加载 2.Be ...

  2. Python爬虫笔记——BeautifulSoup模块

    Target:学会用BeautifulSoup解析和提取网页中的数据. [解析数据]:把服务器返回来的HTML源代码翻译为我们能看懂的样子. [提取数据]:是指把我们需要的数据从众多数据中挑选出来. ...

  3. 06—小白学Python爬虫之BeautifulSoup入门与应用(以糗百为例)

    之前介绍了通过正则和xpath来解析HTML文本,本篇将会介绍一种全新的方式BeautifulSoup来解析HTML,相对前两种使用更简单,那么,在介绍之前,先对这三种方式做一个简单的对比. 抓取方式 ...

  4. Python爬虫:BeautifulSoup库

    Beautiful Soup的简介 Beautiful Soup是python的一个库,最主要的功能是从网页抓取数据.官方解释如下: 1.Beautiful Soup提供一些简单的.python式的函 ...

  5. 萌新向Python数据分析及数据挖掘 第一章 Python基础 第三节 列表简介 第四节 操作列表...

    第一章 Python基础 第三节 列表简介 列表是是处理一组有序项目的数据结构,即可以在一个列表中存储一个序列的项目.列表中的元素包括在方括号([])中,每个元素之间用逗号分割.列表是可变的数据类型, ...

  6. python解析库beautifulsoup_12_Python_解析库_BeautifulSoup的使用

    1.安装 pip3 install BeautifulSoup Beautiful Soup支持的解析器 解析器 使用方法 优势 劣势 Python标准库 BeautifulSoup(markup, ...

  7. python urllib2及beautifulsoup学习

    1.python urllib2爬虫下载网页的三种方法 #-*-coding:utf-8 -*- import urllib2 import cookieliburl = "http://w ...

  8. python网络爬虫--BeautifulSoup

    本随笔记录学习崔庆才老师编著的<Python3网络爬虫开发实战>以及<Beautiful Soup 4.4.0文档>. 安装BeautifulSoup4以及解析器 Instal ...

  9. python学习(25) BeautifulSoup介绍和实战

    BeautifulSoup是python的html解析库,处理html非常方便 BeautifulSoup 安装 pip install beautifulsoup4 BeautifulSoup 配合 ...

最新文章

  1. mysql 赋权_Mysql赋权
  2. 你知道Redis可以实现延迟队列吗?
  3. Xamarin Forms启动自带模拟器缓慢
  4. linux命令行之find详解
  5. C#中StringBuilder类的使用
  6. LCT维护子树信息(BZOJ4530:[BJOI2014]大融合)
  7. SHELL syntax error:unexpected end of file 提示错误
  8. 记录下两个孩子在MineCraft里面还原公寓的经历
  9. Mysql 死锁过程及案例详解之元数据锁MetaData Lock
  10. 算法设计TSP问题动态规划
  11. hibernate中的一对多和多对多的映射关系
  12. object string java_java实现Object转String的4种方法小结
  13. 机器学习面试-模型融合和提升的算法
  14. 恒强制版系统980_恒强制版软件操作答疑
  15. VB中 vbp vbw frm frx log bas 等扩展名大全
  16. h5制作 php 开源,PHP源码:2019最新仿易企秀V15.1完整版开源版源码,修复采集功能、新增同行站模板采集等...
  17. 510cms渗透过程,挂马并提权
  18. xlwings库的基本使用笔记
  19. MD5 标准算法详解
  20. 行业洞察 | Web3、AI4Science、机器人,热门赛道全解析...AI商业化受阻,拐点在何方?...

热门文章

  1. 系统加速精灵 让你的电脑速度飞快
  2. 《鲲鹏》MV,160万开发者的集结号
  3. ECMAScript 6 入门:字符串的新增方法
  4. 爬虫利器 xpath 实践案例
  5. 人人车“破产”? 官方:假消息且存在人为故意传播
  6. 时无英雄,使竖子成名!
  7. 计算机网络知识详解之:TCP连接原理详解
  8. Serverlet是什么?
  9. springMVC消息转换器HttpMessageConverter
  10. 20170706总结