BeautifulSoup使用

安装

pip install beautifulsoup4

解析库

解析库 使用方法 优势 劣势
Python标准库 BeautifulSoup(mk, ‘html.parser’) python的内置标准库、执行速度适中、文档容错能力强 Python2.7 or 3.2.2前的版本中文容错能力差
lxml的HTML解析器 BeautifulSoup(mk, ‘lxml’) 速度快、文档容错能力强 需要安装C语言库
bs4的XML解析器 BeautifulSoup(mk, ‘xml’) 速度快、唯一支持xml的解析器 需要安装C语言库
html5lib的解析器 BeautifulSoup(mk, ‘html5lib’) 最好的容错性、以浏览器的方式解析文档,生成html5格式文档 速度慢、不依赖外部库

基本使用


html = '''
The Domouse's story

The Dormouse's story

Once upon a time there were little sisters;and their names were Lacleand Tillie and they lived at bottom of a well.

...

''' from bs4 import BeautifulSoup soup= BeautifulSoup(html,'lxml') print(soup.prettify())#格式化代码,打印结果自动补全缺失的代码 print(soup.title.string)#文章标题

四大对象种类

Beautiful Soup将复杂HTML文档转换成一个复杂的树形结构,每个节点都是Python对象,所有对象可以归纳为4种: Tag , NavigableString , BeautifulSoup , Comment .

Tag

Tag 就是 HTML 中的标签,tag中最重要的属性: name和attributes。一个Tag可能包含多个字符串或其它的Tag,这些都是这个Tag的子节点.Beautiful Soup提供了许多操作和遍历子节点的属性.注意: Beautiful Soup中字符串节点不支持这些属性,因为字符串没有子节点

tag的名字

操作文档树最简单的方法就是告诉它你想获取的tag的name.如果想获取 标签,只要用 soup.head :

soup.head
# The Dormouse's story

soup.title
# The Dormouse's story

如果要使用嵌套选择,可以一直调用.,比如soup.body.b获取标签中的第一个标签。
通过点取属性的方式只能获得当前名字的第一个tag,如果想要得到所有的标签,或是通过名字得到比一个tag更多的内容的时候,就需要用到 Searching the tree 中描述的方法,比如: find_all()

tag的属性

print soup.p.attrs
#{'class': ['title'], 'name': 'dromouse'}
print soup.p['class']
#['title']

.contents 和 .children、.descendants

tag的 .contents 属性可以将tag的子节点以列表的方式输出,.children与contents的区别在于它将返回一个迭代器,.descendants 属性可以对所有tag的子孙节点进行递归循环

head_tag = soup.head
head_tag
# The Dormouse's story

head_tag.contents
[The Dormouse's story]

title_tag = head_tag.contents[0]
title_tag
# The Dormouse's story
title_tag.contents
# [u'The Dormouse's story']

与孩子相对的有父节点,祖先节点,兄弟节点等,可以参考文档https://beautifulsoup.readthedocs.io/zh_CN/latest/#id18

NavigableString

既然我们已经得到了标签的内容,那么问题来了,我们要想获取标签内部的文字怎么办呢?很简单,用 .string 即可,例如print soup.p.string #The Dormouse's story

BeautifulSoup

BeautifulSoup 对象表示的是一个文档的全部内容.大部分时候,可以把它当作 Tag 对象,是一个特殊的 Tag,我们可以分别获取它的类型,名称,以及属性来感受一下

print type(soup.name)
#
print soup.name 
# [document]
print soup.attrs 
#{} 空字典

Comment

Comment 对象是一个特殊类型的 NavigableString 对象,其实输出的内容仍然不包括注释符号,但是如果不好好处理它,可能会对我们的文本处理造成意想不到的麻烦。

print soup.a
print soup.a.string
print type(soup.a.string)
#, Lacie, Tillie]
soup = BeautifulSoup(html, 'lxml')
print type(soup.select('title'))
print soup.select('title')[0].get_text()

for title in soup.select('title'):
    print title.get_text()

你可能感兴趣的:(BeautifulSoup使用)