前言
我们都知道,在网络爬虫中,提取数据这一步是必不可少的,那么这样的话我们就要借用各种各样的解析库(正则狗都不用,能用解析库就不用正则),那么我就来讲一下我个人使用的最得心应手的解析库---BeautifulSoup4吧,我们可以简称它为bs4,由于我现在使用手机编写此文章,所以没有实例,望大家自己动手,丰衣足食(doge)。
用法
我们都知道,使用urllib.request库中的urlopen()方法可以轻易地向网站发送请求,就像这样
from urllib.request import *
from bs4 import *
url = "https://m.bilibili.com/"
html = urlopen(url)
print(html.read().decode("utf-8))
这样我们就可以爬取到B站的前端源码了,但是我们会发现,这样爬取到的代码混乱不堪,对强迫症极度不友好,这时候bs4就登场了(所有人都给我站一边,因为我bs4要出现),我们可以利用prettify()方法来整理这些代码,当然,要先用BeautifulSoup()方法来把我们爬取的结果转化为BeautifuSoup对象,解析器个人建议html.parser,朴实无华,不需要外部依赖,那么完整代码如下:
from urllib.request import *
from bs4 import *
url = "https://m.bilibili.com/" html = urlopen(url)
soup = BeautifulSoup(html,"html.parser")
print(soup.prettify())
可以看到,这样输出的代码可谓大快人心,非常的舒服,唉唉唉,你忘了我们用解析库干嘛的吗,提取数据啊喂,咳咳,回归正题,想要提取数据也非常简单,比如我们想要提取p节点,怎么办呢,只需要这样:
print(soup.p)
可以看到,这样我们就提取出了p节点,那如果我只想要里面的文本呢,那就这样:
print(soup.p.string)
或者
print(soup.p.get_text())
这样就可以了,那我如果像要div标签的class属性呢,那就这样:
print(soup.div.attrs("class"))
OK啊,这时候就有小伙伴问了,你这玩意,他也只能筛选出第一个啊,别的就不要了?唉唉唉,稍安勿躁,那么,接下来,让我们有请潘周聃…唉不是,串台了,咳咳,有请find_all()
方法和find()方法隆重出场,欢迎欢迎,热烈欢迎(此处添加鼓掌特效)
有了find_all(),我们提取的节点就是所有符合条件的了,但我们需要用一个for循环迭代出来,如下所示,提取所有p标签:
result_list = []
result = soup.find_all("p")
for I in result:
result_list.append(i)
print(result_list)
那如果我要提取所有class属性为"xiaoluo"的节点呢,那就这样:
result_list = []
result = soup.find_all(class = "xiaoluo")
for I in result:
result_list.append(i)
print(result_list)
当然,我们还可以添加更多的属性,但是要以字典的形式,就像这样:
result_list = []
result = soup.find_all("",{"class":"xiaoluo","id":"xiaoluo"})
for I in result:
result_list.append(i) print(result_list)
留出空格是为了避免它把我们传入的字典当做节点参数,那么我们今天就到这了,不说了,我妈催我睡觉了(苦逼的我)再见了 |