BLOG

个人博客,记录学习与生活

BeautifulSoup库笔记

Published Sept. 28, 2019, 3:52 p.m. by kkk

方便易用的网页信息解析库

使用方式:

from bs4 import BeautifulSoup
soup = BeautifulSoup('<html>data</html>', 'html.parser')

只要提供的是标签数据,beautifulsoup库都能做很好的解析,可以讲数据处理成树状结构数据

基本标签和解释器

共有四类解释器:html.parser、lxml、xml、html5lib(其中lxml也是处理HTML的解释器,xml也可以写作lxml-xml)

共有五种基本元素:

  • Tag(标签),指整个标签
  • Name(标签的名字)
  • ttributes(标签的属性),为字典类型,存储了标签的各属性值,如class、href、id等。1. 通过.attrs可获取标签所有的属性 2. 通过类似字典的操作访问,如tag['class']
  • NavigableString(标签内的非属性字符串),字符串,为标签内的字符串信息,通过.string获取,若标签只有一个子节点,也可以通过.string直接获取子节点的字符串内容
  • Comment(标签内字符串的注释部分),不常用,注释是利用!--符号构成的内容<!--This is a comment-->,如,通过NavigableString类可以直接显示其文本内容,不会注明为注释,需要利用一些手段进行自行判断,comment也是一种NaviableString

遍历操作

由于BeautifulSoup对象为树结构,可进行上行、下行和平行遍历

  1. 下行遍历
  2. .contents 获得子节点列表,将所有子节点存入列表,可通过列表结构进行选择性地访问
  3. .children 获得子节点的迭代类型,与.contents类似,用于循环遍历子节点
  4. .descendants 获得子孙节点的迭代类型,包含所有的子孙节点,用于循环遍历
  5. 上行遍历
  6. .parent 获得节点的父节点标签,其中根节点的父节点为自身
  7. .parents 可获得节点的所有先辈标签的迭代类型
  8. 平行遍历
  9. .next_sibling 返回按照HTML文本顺序的下一个平行节点标签
  10. .previous_sibling 返回按照HTML文本顺序的上一个平行节点标签
  11. .next_siblings 迭代类型,返回按照HTML文本顺序的后续所有平行节点标签
  12. .previous_siblings 迭代类型,返回按照HTML文本顺序的前续所有平行节点标签

注意

  • 导入时需要注意,from bs4 import BeautifulSoup,而不是直接导入BeautifulSoup
  • 利用beautifulsoup处理网页内容时,除了网页内容,还需要给出一个解释器,如html.parser或者lxml
  • 利用BeautifulSoup.prettify()可将处理过得网页内容(beautifulsoup对象或者标签)有层次(增加换行符)得再现出来,prettify()方法只能作用于BeautifulSoup对象
  • bs4库默认将所有HTML输入都变成utf-8编码,而由于Python 3以上的版本默认支持编码为utf-8所有解析无障碍,但如果是Python 2的版本,则会出现编码上的问题

信息标记的若干形式

  1. XML(eXtensible Markup Language) --最早的通用信息标记语言,可拓展性好,但略繁琐。适合Internet上的信息交互与传递

内容: ... <\name>

注释:

  1. JSON(JavaScipt Object Notation) --信息有类型,适合程序处理(js),较XML简洁,但无法表示注释。适合移动应用云端和节点的信息通信

从名字可以看出是面向对象的一种表达方式,内容采用类型的键值对key: value进行表示

并列内容采用, 进行分隔

注意:字符串都是用双引号表示,单引号不可以,当值的信息有多个时,才有[ , ]的形式进行组织,可以嵌套,如果嵌套的对象为键值对,则需要用{}符号

  1. YAML(YAML Ain't Markup Language) --信息无类型,文本信息比例最高,且有注释,可读性高。适合各类系统的配置文件

采用无类型的键值对进行信息存储,通过缩进格式来表示信息的嵌套(层次关系)

采用-号表示并列关系

采用#进行注释

采用|进行整块数据的表达

信息提取的方法

  • 形式解析(需要标记解释器
  • 无视搜索(需要文本查找函数
  • 融合搜索(需要标记解析器文本查找函数

文本查找函数(过滤器):

  • <>.find()

  • <>.find_all(name, attrs, recursive, string, **kwargs)

返回一个列表类型,存储查找的结果

name:对标签名称的检索字符串

attrs:对标签属性值的检索字符串,可标注属性检索

recursive:是否对子孙全部检索,默认为True

string:<>...中字符串区域的检索字符串

如果传入参数为列表,Beautiful Soup会将与列表中任一元素匹配的内容返回

参数也可以为方法

可以通过 find_all() 方法的 attrs 参数定义一个字典参数来搜索包含特殊属性的tag

注意:(...) 等价于 .find_all(...); soup(...)等价于 soup.find_all(...)

拓展方法:

  • <>.find() 搜索且只返回一个结果,同.find_all()参数
  • <>.find_parents() 在先辈节点中搜索,返回列表类型,同.find_all()参数
  • <>.find_parent() 在先辈节点中返回一个结果,同.find()参数
  • <>.find_next_siblings() 在后续平行节点中搜索,返回列表类型,同.find_all()参数
  • <>.find_next_sibling() 在后续平行节点中返回一个结果,同.find()参数
  • <>.find_previous_siblings() 在前序平行节点中搜索,返回列表类型,同.find_all()参数
  • <>.find_previous_sibling() 在前序平行节点中返回一个结果,同.find()参数

Share this post
< Pre: 正则表达式 Pos: git学习笔记 >
409 comments
Similar posts
Add a new comment