前言

上一篇有说BS4这个库,这个库通过find,findall,select等函数定位关键节点,获取想要的信息。

find,findall函数用得少,平时用的都是select函数

这个函数通过使用CSS 选择器来定位数据,通过那篇文章,我觉得大多数人应该也是看得比较懵。

那就看操作吧。


实战

初级

先从天气预报开始,就获取8-15天的信息把,这里使用的是chrome浏览器,通过快捷键f12打开开发者工具。

先学会分析页面。确认目标,爬取8-15天的信息

在开发者工具中,点击一下这个鼠标

接下来鼠标放置在要爬取的位置点一下左键,此时就会定位到相应的源代码处。

8-15天的内容,根据源码可以看到,是由一个ul标签包含起来的,下面子标签中span big啥的都有对应的class类名和文本解释。

那么此时,要定位的地方找到了,那现在就是要设计合理的css 选择器代码,来让程序定位到此处。

点击一下开发者工具,通过快捷键Ctrl +F就会在底下弹出一个搜索框

先来了解下CSS 选择器是如何定位classid的。

根据上图指出,当要定位class时,只需要给出类名,例如现在要爬的位置处,有一个ul 包含着的的class类名为t clearfix

此时可以尝试着在搜索框中输入.t.clearfix,由于类名中tclearfix中间有一个空格,所以在搜索时,可以用.号替代空格

此时,黄色的区域就是搜索到的位置,搜索框右边显示出,只找到一个结果。

定位到最外围的ul后,在继续向里深入,可以看到所有信息都是在li标签内的。

但是观察得知,由于有的li标签存在类名t,而有的是没有的。

这时候要搜索子标签,只需要一个空格,在继续输入就可以了。

如果输入.t.clearfix li.t的话,就会发现没有类名的li就无法匹配到

所以这时候要把.t去掉,只需要匹配li,就匹配到没有类名的li

.t.clearfix li

CSS选择器的定位语法已经找到了,接下来就是编写代码

1.首先导入库

1
2
3
4
5
6
7
8
9
# -*- coding:utf-8 -*-
"""
@author:
@file: tianqi.py
@time: 2020-11-11 20:28
@desc:
"""
import requests
from bs4 import BeautifulSoup

2.通过request获取页面信息

1
2
html =requests.get('http://www.weather.com.cn/weather15d/101280101.shtml')
html.encoding='utf8'#将页面编码设置为utf8,防止中文乱码

3.调用bs4库

1
2
soup = BeautifulSoup(html.text,'lxml')
clearfix = soup.select('.t.clearfix li')#使用select定位语法

此时通过printf打印一下看下结果。

可以看到,输出结果在一个[]内,在Python中,要脱离这个[],只需要通过for循环就可以了。

4.for循环

1
2
for clearfixs in clearfix:
print(clearfixs)

此时每一段都是分工明确,输出出来,但是此时只需要里面的中文,哪些html代码是不需要的,所以要提取文本。

这个时候可以使用get_text()函数提取文本

1
2
for clearfixs in clearfix:
print(clearfixs.get_text())

还有一些多余的换行,也可以去掉,使用replace函数,这个函数不了解的可以百度,有参数解释,这里不做过多的解释

1
2
for clearfixs in clearfix:
print(clearfixs.get_text().replace("\n",''))

完整代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# -*- coding:utf-8 -*-
"""
@author:
@file: tianqi.py
@time: 2020-11-11 20:28
@desc:
"""
import requests
from bs4 import BeautifulSoup

html =requests.get('http://www.weather.com.cn/weather15d/101280101.shtml')
html.encoding='utf8'
#ul.clearfix li.t
soup = BeautifulSoup(html.text,'lxml')
clearfix = soup.select('.t.clearfix li')
for clearfixs in clearfix:
print(clearfixs.get_text().replace("\n",''))

后面还有一些其他的实战后面在写