BeautifulSoup
如何使用BeautifulSoup
它由很多标签(Tag)组成,比如 html、head、title等等都是标签
一个标签对构成一个节点,比如 ... 是一个根节点
节点之间存在某种关系,比如 h1 和 p 互为邻居,他们是相邻的兄弟(sibling)节点
h1 是 body 的直接子(children)节点,还是 html 的子孙(descendants)节点
body 是 p 的父(parent)节点,html 是 p 的祖辈(parents)节点
嵌套在标签之间的字符串是该节点下的一个特殊子节点,比如 “hello, world” 也是一个节点,只不过没名字。
使用 BeautifulSoup
构建一个 BeautifulSoup 对象需要两个参数,第一个参数是将要解析的 HTML 文本字符串,第二个参数告诉 BeautifulSoup 使用哪个解析器来解析 HTML。
解析器负责把 HTML 解析成相关的对象,而 BeautifulSoup 负责操作数据(增删改查)。”html.parser” 是Python内置的解析器,”lxml” 则是一个基于c语言开发的解析器,它的执行速度更快,不过它需要额外安装
通过 BeautifulSoup 对象就可以定位到 HTML 中的任何一个标签节点。
from bs4 import BeautifulSoup
text = """
hello, worldBeautifulSoup
如何使用BeautifulSoup
第二个p标签
"""
soup = BeautifulSoup(text, "html.parser")
# title 标签
>>> soup.title
hello, world# p 标签
>>> soup.p
\u5982\u4f55\u4f7f\u7528BeautifulSoup
# p 标签的内容
>>> soup.p.string
u'\u5982\u4f55\u4f7f\u7528BeautifulSoup'
BeatifulSoup 将 HTML 抽象成为 4 类主要的数据类型,分别是Tag , NavigableString , BeautifulSoup,Comment 。每个标签节点就是一个Tag对象,NavigableString 对象一般是包裹在Tag对象中的字符串,BeautifulSoup 对象代表整个 HTML 文档。例如:
>>> type(soup)
>>> type(soup.h1)
>>> type(soup.p.string)
Tag
每个 Tag 都有一个名字,它对应 HTML 的标签名称。
>>> soup.h1.name
u'h1'
>>> soup.p.name
u'p'
标签还可以有属性,属性的访问方式和字典是类似的,它返回一个列表对象
>>> soup.p['class']
[u'bold']
NavigableString
获取标签中的内容,直接使用 .stirng 即可获取,它是一个 NavigableString 对象,你可以显式地将它转换为 unicode 字符串。
>>> soup.p.string
u'\u5982\u4f55\u4f7f\u7528BeautifulSoup'
>>> type(soup.p.string)
>>> unicode_str = unicode(soup.p.string)
>>> unicode_str
u'\u5982\u4f55\u4f7f\u7528BeautifulSoup'
基本概念介绍完,现在可以正式进入主题了,如何从 HTML 中找到我们关心的数据?BeautifulSoup 提供了两种方式,一种是遍历,另一种是搜索,通常两者结合来完成查找任务。
遍历文档树
遍历文档树,顾名思义,就是是从根节点 html 标签开始遍历,直到找到目标元素为止,遍历的一个缺陷是,如果你要找的内容在文档的末尾,那么它要遍历整个文档才能找到它,速度上就慢了。因此还需要配合第二种方法。
通过遍历文档树的方式获取标签节点可以直接通过 .标签名的方式获取,例如:
获取 body 标签:
>>> soup.body
\nBeautifulSoup
\n\u5982\u4f55\u4f7f\u7528BeautifulSoup
\n