[Python]BeautifulSoup—HTML解析包

在用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(注释节点)。

如下图:

[Python]BeautifulSoup—HTML解析包_第1张图片

这四种类型的节点构成树,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

你可能感兴趣的:(python,beautifulsoup,HTML标签解析)