前边我们介绍了难度始终,功能强大,速度快的lxml和xpath来解决解析页面的工具,但是他的有点很明显,但是缺点也相对明显一点,那就是学习成本稍微大一下,如果页面稍微变个结构,那么整个我们的爬虫程序就要做修改了,所以今天我们就来介绍一个api更加人性化,但是速度不是很快的工具BeautifulSoup4。
安装
pip install bs4
简单使用
访问我博客的列表页
from bs4 import BeautifulSoup
import requests
url = "https://blog.csdn.net/lovemenghaibin?t=1"
header = {
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36"
}
resp = requests.get(url, headers=header)
soup = BeautifulSoup(resp.text, "lxml")
print(soup.prettify())
常用的标签
Beautiful Soup将复杂HTML文档转换成一个复杂的树形结构,每个节点都是Python对象,所有对象可以归纳为4种:
- Tag
- NavigatableString
- BeautifulSoup
- Comment
Tag
通俗的说,他就是我们html的标签,例如a标签,p标签,div标签等等。使用如下:
print(soup.title)
# <title>【ermuv5】一个小小的程序员 - CSDN博客</title>
print(soup.a)
# <a href="https://blog.csdn.net/lovemenghaibin">ermuv5</a>
但是这么操作只能渠道默认的第一个,但是他还有两个特别重要的功能name和attrs,name返回该标签的名称,attrs返回一个字典,包含属性名称和值。
print(soup.title.name)
# title
print(soup.a.attrs)
# {'href': 'https://blog.csdn.net/lovemenghaibin'}
NavigableString
获取标签内的内容。例如:
print(soup.title.string)
# 【ermuv5】一个小小的程序员 - CSDN博客
print(soup.string)
# None
BeautifulSoup
BeautifulSoup 对象表示的是一个文档的全部内容.大部分时候,可以把它当作 Tag 对象,它支持 遍历文档树 和 搜索文档树 中描述的大部分的方法.
因为 BeautifulSoup 对象并不是真正的HTML或XML的tag,所以它没有name和attribute属性.但有时查看它的 .name 属性是很方便的,所以 BeautifulSoup 对象包含了一个值为 “[document]” 的特殊属性 .name
Comment
Tag , NavigableString , BeautifulSoup 几乎覆盖了html和xml中的所有内容,但是还有一些特殊对象.容易让人担心的内容是文档的注释部分:
markup = "<b><!--Hey, buddy. Want to buy a used parser?--></b>"
soup = BeautifulSoup(markup)
comment = soup.b.string
type(comment)
#<class 'bs4.element.Comment'>
Comment 对象是一个特殊类型的 NavigableString 对象:
comment
#'Hey, buddy. Want to buy a used parser'
遍历文档
contents和children
soup = BeautifulSoup(resp.text, "lxml")
head_tag = soup.head
contents = head_tag.contents
# print(contents)
children = head_tag.children
for child in children:
print(child)
strings 和 stripped_strings
获取标签内所有的内容
strings = soup.head.stripped_strings
for info in strings:
print(info)
#
# 【ermuv5】一个小小的程序员 - CSDN博客
# var username = "lovemenghaibin";
# var blog_address = "https://blog.csdn.net/lovemenghaibin";
# var static_host = "https://csdnimg.cn/release/phoenix/";
# var currentUserName = "";
# var isShowAds = true;
# var isOwner = false;
# var loginUrl = "https://passport.csdn.net/account/login?from=https://blog.csdn.net/lovemenghaibin"
# var blogUrl = "https://blog.csdn.net/";
# //页面皮肤样式
# var curSkin = "skin3-template";
# // 第四范式所需数据
# var articleTitles = "【ermuv5】一个小小的程序员";
# var articleID = "";
# var nickName = "孟海滨";
选择器
熟悉html的同学,对于css的选择器不陌生,在bs中,同样有非常好用的选择器。
find和find_all方法
find查询出来的第一个,find_all查询出来所有的信息。
find:
soup = BeautifulSoup(resp.text, "lxml")
a = soup.find("a", attrs={"id": "uid"})
# <a class="" href="https://me.csdn.net/lovemenghaibin" id="uid" target="_blank">孟海滨</a>
print(a)
print(soup.find_all("a", id="uid"))
# [<a class="" href="https://me.csdn.net/lovemenghaibin" id="uid" target="_blank">孟海滨</a>]
select
使用以上方法可以方便的找出元素。但有时候使用css选择器的方式可以更加的方便。使用css选择器的语法,应该使用select方法。以下列出几种常用的css选择器方法:
1.通过标签名查找:
print(soup.select(‘a’))
2.通过类名查找:
通过类名,则应该在类的前面加一个.。比如要查找class=sister的标签。示例代码如下:
print(soup.select('.active'))
3. 根据标签走
title = soup.select("head > title")
print(title)
# [<title>【ermuv5】一个小小的程序员 - CSDN博客</title>]
print(soup.select("dl #asideProfile"))
小结
本节就讲一下这些api的基本使用,例如select,find,find_all,select_one,strings,标签,下一节,我们继续用bs4把我的博客列表页的信息给拿出来,看看他是不是看起来比xpath更加的友好。