python爬虫之-BeautifulSoup4

前边我们介绍了难度始终,功能强大,速度快的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种:

  1. Tag
  2. NavigatableString
  3. BeautifulSoup
  4. 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更加的友好。

发布了176 篇原创文章 · 获赞 84 · 访问量 44万+

猜你喜欢

转载自blog.csdn.net/lovemenghaibin/article/details/82900978