在用Python写爬虫时,一个常见的操作是对抓下的HTML做分析处理,得到想要的内容。一般的方法为使用Python的re库中。用正則表達式来解析文本。只是这样的方法适用于全部的文本。而针对于特定格式的文本,如这里的HTML。BeautifulSoup更具有针对性,使用起来也更方便。

BeautifulSoup能够解析HTML。XML等文件,这里仅仅说明其解析HTML的功能。

BeautifulSoup(下面简称BS)的官方网站为:http://www.crummy.com/software/BeautifulSoup/

BS把HTML看做一个树形,以标签和文本为基本类型,一个标签包括其它标签。被解析为一个标签是还有一个标签的子树。那么。终于整个HTML文档被解析为一棵树的形式。

BS包含四种基本类型:

Soup(树),Tag(标签节点),String(字符节点),Comment(凝视节点)。

例如以下图:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaWNlMTEwOTU2/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" width="847" height="550">

这四种类型的节点构成树,Soup代表这颗树。String为叶子节点,tag为标签子节点,为其标签包括的全部内容。

建树

import bs4#导入BeautifulSoup库

Soup = BeautifulSoup(html)#当中html 能够是字符串。也能够是句柄

须要注意的是,BeautifulSoup会自己主动检測传入文件的编码格式,然后转化为Unicode格式

通过如上两句话。BS自己主动把文档生成为如上图中的解析树。

节点属性

能够通过Tag.attrs訪问,返回字典结构的属性。

或者Tag.name这样訪问特定属性值,假设是多值属性则以列表形式返回。

遍历

子节点:

Tag.Tag_child1:直接通过下标名称訪问子节点。

Tag.contents:以列表形式返回全部子节点。

Tag.children:生成器,可用于循环訪问:for child in Tag.children

String 子节点:

Tag.String:Tag仅仅有一个String子节点是,能够这么訪问,否则返回None

Tag.Strings:生成器。可用于循环訪问:for str in Tag.Strings

子孙节点:

Tag.descendants:生成器,可用于循环訪问:for des inTag.descendants

父节点:

Tag.parent:父节点

Tag.parents:父到根的全部节点

兄弟节点:

Tag.next_sibling

Tag.next_siblings

Tag.previous_sibling

Tag.previous_siblings

查找

最经常使用的是find_all()函数

方法搜索当前tag的全部tag子节点,并推断是否符合过滤器的条件。

find_all( name , attrs , recursive , text ,**kwargs )

第一个參数为Tag的名称

#第一个參数为Tag的名称,如:
tag.find_all(‘title’)
#得到”<title>&%^&*</title>”,结果为一个列表

第二个參数为匹配的属性

tag.find_all(“title”,class=”sister”)
#得到如”<title class = “sister”>%^*&</title>

第二个參数也能够为字符串,得到字符串匹配的结果

tag.find_all(“title”,”sister”)
#得到如”<title class = “sister”>%^*&</title>

完整具体的中文文档见:

http://www.crummy.com/software/BeautifulSoup/bs4/doc/index.zh.html

最新文章

  1. PHP redis 批量操作
  2. linux 学习之路
  3. 修改内联CSS(点击按钮连续改变文字大小、位置,.animate()方法)
  4. 指定WebService访问的语言
  5. API地图坐标转化(批量转换坐标)
  6. Kill Process by Name
  7. C#中字符串的处理,对象的引用及继承(Tenth day)
  8. iOS UIView常用的一些方法setNeedsDisplay和setNeedsLayout 区别
  9. GetConsoleTitle 函数--获取控制台窗口标题
  10. 洛谷P3159 [CQOI2012]交换棋子
  11. 【Uva 11280 飞到弗雷德里顿】
  12. 201771010126 王燕《面向对象程序设计(java)》第二周学习总结
  13. 生命周期--JSF
  14. lr分布式测试--笔记
  15. node-cache
  16. 记账本NABCD分析
  17. xterm下字体设置
  18. JS中的弹窗问题confirm和prompt
  19. 低级问题: jquery-ajax-alert(data) &lt;!DOCTYPE html PUBLIC &quot;-
  20. 移动端微信应用开发总结(function ajax meta)

热门文章

  1. linux系统调用实现代码分析【转】
  2. Uva 10158 War
  3. Git-添加或删除文件
  4. Fiddler抓包4-工具介绍(request和response)【转载】
  5. css实现web前端最美的loading加载动画!
  6. NEUQOJ 1999: 三角形or四边形?【搜索联通块/模拟】
  7. 详解xml
  8. luogu P1041 传染病控制
  9. linux-系统启动过程,执行的配置文件
  10. PowerPoint在线浏览的几个方案