Beautiful Soup parses anything you give it, and does the tree traversal stuff for you.

BeautifulSoup库是解析、遍历、维护 “标签树” 的功能库(遍历,是指沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问)。https://www.crummy.com/software/BeautifulSoup

BeautifulSoup库我们常称之为bs4,导入该库为:from bs4 import BeautifulSoup。其中,import BeautifulSoup即主要用bs4中的BeautifulSoup类。

bs4库解析器

BeautifulSoup类的基本元素

 import requests
 from bs4 import BeautifulSoup

 res = requests.get('http://www.pmcaff.com/site/selection')
 soup = BeautifulSoup(res.text,'lxml')
 print(soup.a)
 # 任何存在于HTML语法中的标签都可以用soup.<tag>访问获得,当HTML文档中存在多个相同<tag>对应内容时,soup.<tag>返回第一个。

 print(soup.a.name)
 # 每个<tag>都有自己的名字,可以通过<tag>.name获取,字符串类型

 print(soup.a.attrs)
 print(soup.a.attrs['class'])
 # 一个<tag>可能有一个或多个属性,是字典类型

 print(soup.a.string)
 # <tag>.string可以取到标签内非属性字符串

 soup1 = BeautifulSoup('<p><!--这里是注释--></p>','lxml')
 print(soup1.p.string)
 print(type(soup1.p.string))
 # comment是一种特殊类型,也可以通过<tag>.string取到

运行结果:

<a class="no-login" href="">登录</a>

a

{'href': '', 'class': ['no-login']} ['no-login']

登录

这里是注释

<class 'bs4.element.Comment'>

bs4库的HTML内容遍历

HTML的基本结构

标签树的下行遍历

其中,BeautifulSoup类型是标签树的根节点。

 # 遍历儿子节点
 for child in soup.body.children:
     print(child.name)

 # 遍历子孙节点
 for child in soup.body.descendants:
     print(child.name)

标签树的上行遍历

 # 遍历所有先辈节点时,包括soup本身,所以要if...else...判断
 for parent in soup.a.parents:
     if parent is None:
         print(parent)
     else:
         print(parent.name)

运行结果:

div

div

body

html

[document]

标签树的平行遍历

 # 遍历后续节点
 for sibling in soup.a.next_sibling:
     print(sibling)

 # 遍历前续节点
 for sibling in soup.a.previous_sibling:
     print(sibling)

bs4库的prettify()方法

prettify()方法可以将代码格式搞的标准一些,用soup.prettify()表示。在PyCharm中,用print(soup.prettify())来输出。

操作环境:Mac,Python 3.6,PyCharm 2016.2

参考资料:中国大学MOOC课程《Python网络爬虫与信息提取》

-----   End   -----

更多精彩内容关注我公众号:杜王丹

作者:杜王丹,互联网产品经理

最新文章

  1. JAVA调用R
  2. ORA-01439: 要更改数据类型, 则要修改的列必须为空
  3. ERP联系记录管理(十七)
  4. 4、C#基础整理(if语句经典习题)
  5. [转]unzip解压windows zip乱码的处理
  6. ruby2.2.2在msvc2010上编译
  7. Cocos Studio1.5.0.1开发学习笔记(一)
  8. [LeetCode283]Move Zeros将一个数组中为0的元素移至数组末尾
  9. XCode消除警告、错误
  10. Spring4 JDBC详解
  11. 史上最全常用正则表达式(Javascript公众号推文)
  12. Taro 生命周期
  13. webstorm常用功能FTP,及常用快捷键
  14. JSP使用sessionScope获取session值
  15. Redis---事务和Wtach
  16. C#调用XmlSerializer序列化时生成CDATA节点解决方法
  17. no-siteapp 和 no-transform
  18. PHP Token(令牌)设计 避免重复提交
  19. Cenos6.6 升级 python3.5.2 安装配置 django1.10
  20. CLR的八大特性

热门文章

  1. shiro实战系列(三)之架构
  2. java操作数据库的事务支持
  3. Android使用AsyncTask设置请求超时的注意事项
  4. P1726 上白泽慧音
  5. 备份时如何排除掉默认的 information_schema 和 mysql 库?
  6. EXCEL2007出错了无法使用文档中的ActiveX 控件
  7. input:file onchange事件无法读取解决方法
  8. 基于R语言的时间序列分析预测
  9. Django Rest Framework源码剖析(三)-----频率控制
  10. Exp9 Web安全基础实践