BeautifulSoup4
1,什么是BeautifulSoup4?
和 lxml 一样,Beautiful Soup 也是python的一个HTML/XML的解析器,用它可以方便的从网页中提取数据,Beautiful Soup相比lxml操作起来更简单,但是速度较慢,这也是它的缺点
lxml 只会局部遍历,而Beautiful Soup 是基于HTML DOM的,会载入整个文档,解析整个DOM树,因此时间和内存开销都会大很多,所以性能要低于lxml。
BeautifulSoup 用来解析 HTML 比较简单,API非常人性化,支持CSS选择器、Python标准库中的HTML解析器,也支持 lxml 的 XML解析器。
2,怎么使用BeautifulSoup4?
使用 pip 安装即可:pip install beautifulsoup4
安装完成使用:from bs4 import BeautifulSoup导入,下面举例代码说明:
from bs4 import BeautifulSoup
html = """
The Dormouse's story
The Dormouse's story
Once upon a time there were three little sisters; and their names were
,
Lacie and
Tillie;
and they lived at the bottom of a well.
...
"""
#创建 Beautiful Soup 对象
soup = BeautifulSoup(html,'lxml')
#打开本地 HTML 文件的方式来创建对象
#soup = BeautifulSoup(open('index.html'))
#格式化输出 soup 对象的内容
print(soup.prettify())
我们可以通过soup = BeautifulSoup(html,“lxml”)方式指定lxml解析器,bs4在解析时依赖解析器,
lxml HTML 解析器 BeautifulSoup(markup,‘lxml’) 速度快、文档容错能力强
接下来说下搜索文档树,这里有个find_all()方法,介绍一下它的几个常用参数
name参数:可以根据节点名查询
attrs参数: 可以根据节点属性查询
text参数: 用来匹配节点文本
CSS选择器
这就是另一种与 find_all 方法有异曲同工之妙的查找方法.写 CSS 时,标签名不加任何修饰,类名前加.,id名前加#在这里我们也可以利用类似的方法来筛选元素,用到的方法是soup.select(),返回类型是 list,下面说一下它的表达式,简单列举几个
.container 选取所有class包含container的节点
li a 选取所有li下的所有a节点
div#container > ul 选取id为container的div的ul子元素
a[href=“http://jobbole.com”] 选取所有href属性为jobbole.com值的a元素
列举代码说明:
通过标签名查找
soup.select(‘title’)
soup.select(‘b’)
通过类名查找 print soup.select('.sister')
通过 id 名查找 print soup.select('#link1')
组合查找 组合查找即和写 class 文件时,标签名与类名、id名进行的组合原理是一样的,例如查找 p 标签中,id 等于 link1的内容,二者需要用空格分开 print soup.select('p #link1')
还有一个就是直接子标签查找,则使用 > 分隔 print soup.select("head > title")
属性查找
**注意:**查找时还可以加入属性元素,属性需要用中括号括起来,注意属性和标签属于同一节点,所以中间不能加空格,否则会无法匹配到。
print(soup.select('a[]'))
soup.select('a[href="http://example.com/elsie"]')
同样,属性仍然可以与上述查找方式组合,不在同一节点的空格隔开,同一节点的不加空格
print (soup.select('p a[href="http://example.com/elsie"]'))
获取内容
以上的 select 方法返回的结果都是列表形式,可以遍历形式输出,然后用 get_text() 方法来获取它的内容,attrs[‘属性名’] 获取属性值
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())
print (title.attrs['class'])