安装
Beautiful Soup
官方文档是一个HTML/XML
的解析器,主要的功能是如何解析和提取HTML/XML
数据;
lxml
只会局部遍历,而Beautiful Soup
是基于HTML DOM
的,会载入整个文档,解析整个DOM
树,因此解析时间和内存开销都会大很多,所以性能要低于lxml
;
BeautifulSoup
用来解析HTML
比较简单,API
非常人性化,支持CSS
选择器、Python
标准库中的HTML
解析器,也支持lxml
的XML
解析器;
pip install beautifulsoup4
from bs4 import BeautifulSoup
# html为解析文本, 'lxml'指定解析器
soup = BeautifulSoup(html, 'lxml')
# 格式化输出 soup 对象的内容
print(soup.prettify())
参数: find_all(name, attrs, recursive, text, **kwargs)
**
name
参数
name 参数可以查找所有名字为 name 的tag,字符串对象会被自动忽略掉
A.字符串
最简单的过滤器是字符串,在搜索方法中传入一个字符串参数,Beautiful Soup
会查询与字符串完整匹配的内容;
# 查询标签名称为<p></p>标签的元素列表
soup.find_all('p')
B.正则
如果传入正则表达式作为参数,Beautiful Soup会通过正则表达式的 match() 来匹配内容.下面例子中找出所有以b开头的标签,这表示和标签都应该被找到
soup.find_all(re.compile(r'^b'))
C.列表
如果传入列表参数,Beautiful Soup会将与列表中任一元素匹配的内容返回
# 查询html中标签名称为<p></p>或者<b></b>的元素
soup.find_all(["p", "b"])
keyword
参数
# 查询<p></p>标签对象的class属性是title的元素
soup.find_all('p',attrs={'class':'title'})
text
参数
通过 text 参数可以搜索文档中的字符串内容,与 name 参数的可选值一样, text 参数接受 字符串 , 正则表达式 , 列表
soup.find_all(text="Elsie")
soup.find_all(text=["Tillie", "Elsie", "Lacie"])
soup.find_all(text=re.compile("DorMouse+"))
find
使用
find的用法与find_all一样,区别在于find返回 第一个符合匹配结果,find_all则返回 所有匹配结果的列表
三、CSS
选择器
CSS选择器与 find_all 方法有异曲同工之妙的查找方法,也是返回所有匹配结果的列表。
写 CSS 时,标签名不加任何修饰,类名前加.,id名前加# 在这里我们也可以利用类似的方法来筛选元素,用到的方法是 soup.select(),返回类型是 list (1)通过标签选择器查找 soup.select('title')
# 结果-->[<title>The Dormouse's story</title>]
soup.select('.title')
# 结果-->[<p class="title" name="dromouse"><b>The Dormouse's story</b></p>]
soup.select('#link1')
# 结果-->[<a class="sister" href="http://example.com/elsie" id="link1"><!-- Elsie --></a>]
soup.select('p #link1')
# 结果-->[<a class="sister" href="http://example.com/elsie" id="link1"><!-- Elsie --></a>]
soup.select("a[class='sister']")
get_text()
获取文本内容
以上的 select 方法返回的结果都是列表形式,可以遍历形式输出,然后用 get_text() 方法来获取它的内容
(7)获取属性# 创建Beautiful Soup对象
soup = BeautifulSoup(html, 'lxml')
# 打印<a></a>标签的href属性
print(soup.select('a')[0].get('href'))
print(soup.find('a').get('href'))
print(soup.find_all('a')[0].get('href'))
print(soup.find('p').get('name'))
# 打印结果
http://example.com/elsie
http://example.com/elsie
http://example.com/elsie
dromouse
Beautiful Soup
将复杂HTML文档转换成一个复杂的树形结构,每个节点都是Python对象,所有对象可以归纳为4种:Tag
NavigableString
BeautifulSoup
Comment
代码展示
# 创建Beautiful Soup对象
soup = BeautifulSoup(html, 'lxml')
# 打印获取的对象类型
print(type(soup.a))
print(type(soup.p.string))
print(type(soup))
print(type(soup.a.string))
打印结果
<class 'bs4.element.Tag'>
<class 'bs4.element.NavigableString'>
<class 'bs4.BeautifulSoup'>
<class 'bs4.element.Comment'>
.contents
,.children
属性
3.1.1 .content
tag的.content属性可以将tag的子节点以列表方式输出
# 创建Beautiful Soup对象
soup = BeautifulSoup(html, 'lxml')
# 把soup对象中第一个<p></p>标签的子节点以列表形式输出
print(soup.p.contents)
输出结果
[<b>The Dormouse's story</b>, <a>3</a>]
.children
它返回的不是一个 list,不过我们可以通过遍历获取所有子节点。
我们打印输出 .children 看一下,可以发现它是一个 list 生成器对象
soup.p.children
<list_iterator object at 0x000002ADD46B95F8>