Python爬虫利器:Beautiful Soup

Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库。使用它来处理HTML页面就像JavaScript代码操作HTML DOM树一样方便。官方中文文档地址

1. 安装 1.1 安装 Beautiful Soup

Beautiful Soup3 目前已经停止维护,推荐使用 Beautiful Soup4,现在已经被移植到 bs4,导入的时候需要从 bs4 导入。安装方法如下:

# 使用 pip 安装 pip install beautifulsoup4 # 使用 easy_install 安装 easy_install beautifulsoup4 1.2 安装解析器 lxml

另外还需要安装相应的解析器,lxml,html5lib 任选一个即可。

# 安装 lxml pip install lxml # 安装 html5lib pip install html5lib 1.3 使用方法

安装了 BeautifulSoup 以后可以导入使用。将一段文档传入BeautifulSoup 的构造方法,就能得到一个文档的对象, 可以传入一段字符串或一个文件句柄.

# 首先从 bs4 导入 from bs4 inport BeautifulSoup # 使用解析器和html文档可以初始化 soup = BeautifulSoup(open("http://www.likecs.com/index.html"), \'lxml\') content = \'<html>data</html>\' soup = BeautifulSoup(content, \'lxml\')

文档需要转换成Unicode,并且HTML的实例都被转换成Unicode编码

2. BeautifulSoup中的对象

Beautiful Soup将复杂HTML文档转换成一个复杂的树形结构,类似于浏览器中的DOM节点数,每个节点都是Python对象,所有对象可以归纳为4种: Tag , NavigableString , BeautifulSoup , Comment 。

2.1 tag 对象

tag 对象类似于一个标签节点。与XML或HTML原生文档中的标签相同,如 body,div,a,span。tag 对象有很多方法和属性。tag 对象的属性可以像字典一样进行增删改查操作。

2.1.1 name 属性

name 属性表示 tag 的名称。通过 .name 获取。如果改变了tag的name,那将影响所有通过当前Beautiful Soup对象生成的HTML文档。

2.1.2 attributes 属性

一个tag可能有很多个属性,使用 tag.attrs 获取 tag 的所有节点属性,可以对这些属性进行增删改查。获取方法如下:

tag.attrs:获取属性列表

tag.attrs[1]:获取属性列表中的第2个属性

tag.get(\'href\'):获取 href 属性

tag[\'href\']:获取 href 属性

2.1.3 多值属性

在HTML文档中有典型像 class 一样的有多个属性值,这些多值属性返回的值不是 string ,而是 list 。这些多值属性的节点类型如下:

class

rel

rev

accept-charset

headers

accesskey

在XML文档中没有多值属性

content = \'<a href="http://www.likecs.com/index.html" data="1 2 3"></a>\' soup = BeautifulSoup(content, \'lxml\') tag = soup.a # 获取 a 标签 tag.name # 标签名称:a tag.attrs # 属性列表:[\'href\', \'class\', \'data\'] tag.get(\'href\') # 获取href属性:index.html tag[\'class\'] # 获取class属性为list:[button,button-blue] tag[\'data\'] # data属性的值为string:1 2 3 2.2 NavigableString 对象

字符串常被包含在tag内,Beautiful Soup用 NavigableString 类来包装tag中的字符串。

使用 tag.string 获取 tag 内字符串,为NavigableString

使用 unicode(tag.string) 转换为一般Unicode字符串

tag 内字符串不能编辑

tag.string.replace_with(\'content\') 替换 tag 内字符串

tag 内字符串不支持 .contents 或 .string 属性或 find() 方法

在Beautiful Soup之外使用 NavigableString 对象需要调用 unicode() 方法

2.3 BeautifulSoup 对象

BeautifulSoup 对象表示的是一个文档的全部内容。大部分时候,可以把它当作 tag 对象。

因为 BeautifulSoup 对象并不是真正的HTML或XML的tag,BeautifulSoup 对象包含了一个值为 “[document]” 的特殊属性 .name。

2.4 Comment 对象

Comment 对象是一个特殊类型的 NavigableString 对象,用来表示文档的注释部分。

markup = "<b><!--Hey, buddy. Want to buy a used parser?--></b>" soup = BeautifulSoup(markup) comment = soup.b.string type(comment) # <class \'bs4.element.Comment\'> print(soup.b.prettify()) # <b> # <!--Hey, buddy. Want to buy a used parser?--> # </b> 3. 遍历文档树

通过遍历文档树,能够从文档中找到指定的内容。

3.1 子节点

一个 tag 可能包含多个字符串或者其他 tag,这些 tag 就是顶层的子节点,Beautiful Soup提供了许多操作和遍历子节点的属性。需要注意:

字符串没有子节点。

BeautifulSoup 对象本身一定会包含子节点

假设有以下几种简单的方式获取子节点:

使用tag名:获取第一个直接子节点:soup.div.p

使用contents属性:获取所有直接子节点列表:soup.div.contents

使用children属性: 对子节点进行循环:soup.div.children

使用descendants属性:所有tag的子孙节点进行递归循环:soup.div.descendants

使用string属性:获取只有一个string子节点tag的子节点:p.string

使用strings属性:循环有多个string子节点的情况:div.strings

div_html = \' <div> <p>uu</p> <p>sa</p> <p> <a>ma</a> --> </p> </div>\' soup = BeautifulSoup(div_html), \'lxml\') div = soup.div # 获取 div 节点 div.p # <p>uu</p> div.contents # [<p>uu</p>, <p>sa</p>, <p><a>ma</a>--></p>] div.contents[0] # <p>uu</p> for child in div.children: print(child) # <p>uu</p><p>sa</p><p><a>ma</a>--></p> for child in div.descendants: pring(child) 3.2 父节点

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zypzws.html