BeautifulSoup 简介
这个简写 bs 现在都是bs4,bs3 已经停止开发了,可以看看官方文档
BeautifulSoup,就是一个第三方的库,使用之前需要安装
pip install bs4
,这里还是切换国内源的问题,按之前我的博客里配置好的就不用管了。
使用方法
form bs4 import BeautifulSoup
可以将一个html文档 转化为指定对象,然后通过对象的方法或属性去查找指定的内容:
- 转化本地文件;
soup = BeautifulSoup(open(‘本地文件’),‘lxml’) - 转化网络文件:
soup = BeautifulSoup(‘字符串类型或字节类型’,‘lxml’)
这里,lxml
是解析库,一般默认的就是调用系统中的解析库
- (1) 根据标签名查找
soup.a 只能找到第一个a标签
- (2) 获取属性
soup.a[‘herf’] 类似于字典的获取方法
soup.a.attrs 这个以字典的形式返回所有的属性
- (3) 获取内容
soup.a.string
soup.a.text
soup.a.get_text()
soup.a.get(‘herf’) a 的 herf 属性
注意: 当标签里面还有标签的时候,string获取的为None,其他两个获取纯文本内容
- (4) find
soup.find(‘a’, title=‘qing’) 找title 是qing的 a
soup.find(‘a’)
find只能找到符合要求的第一个标签,他返回的是一个对象
- (5)find_all
soup.find_all([‘a’, ‘b’])
返回一个列表,列表里面是所有的符合要求的对象
- (6)select
根据css选择器选择知道内容
常见的选择器:
标签选择器,类选择器,id选择器,组合选择器,层级选择器伪类选择器,属性选择器
select 返回的永远是列表,列表里是对象,要用下标来访问指定的对象,然后获取 属性 和 内容。
select(’.sist‘)
找到所以类名为 sist 的标签。
select('#one')
找到 id 为 one 的标签
select('head title')
后代你选择,head 下面的 title
select('title,.title')
祖选择器,
select('a[id="link3"]')
属性选择器
注意:find find_all select不仅适用于soup对象,还适用于其他的子对象,如果调用子对象的select方法,那么就是从这个子对象里面去找符合这个选择器的标签
实例 : 爬取 北京市企业大全
开始是要爬取 智联招聘就是这个网站
但突然发现 有点麻烦,这个后面再讲吧,这里主要是学会 bs4 解析页面。
下面我们爬取 北京企业名称。这次封装一个对象来写程序,顺便复习一下python
我们容易发现页码的规律,然后,找一找bs4要解析的标签。
一个a标签,下面还有一个 b 标签,我们可以先找到所有的a 再循环找b并取出内容
import requests
from bs4 import BeautifulSoup
class ZhiLianSpider(object):
# init方法,叫做初始化方法,本质上就是一个函数
# 当实例化对象时 ,就会自动执行 init方法 将对象作为第一个参数传入,参数名称位self,self是可以更改的但是不建议!
# 功能:用户给对象附初始值
url = 'http://shop.99114.com/list/area/101101_' # 这是类属性
# 保存成员属性
def __init__(self, start_page, end_page):
self.start_page = start_page
self.end_page = end_page
# 获取响应
def get_response(self, p):
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36'
}
url_now = self.url + str(p)
response = requests.get(
url=url_now, headers=headers).content.decode('utf8')
return response
# 解析内容函数
def parse_txt(self, content):
soup = BeautifulSoup(content, 'lxml')
name_list = soup.find_all('a', target="_blank")
# print(name_list)
b_list = []
for a in name_list:
b = a.find('b')
b_list.append(b)
for b in b_list:
if b is not None:
#print(b)
with open ('ll.txt' , 'a',encoding='utf8') as f:
f.write(b.text+'\n')
# 写爬取主程序,
def run(self):
for p in range(self.start_page, self.end_page+1):
# 发送请求,获取响应
content = self.get_response(p)
# with open('h.html', 'w', encoding='utf8') as f:
# f.write(content)
# 解析内容
self.parse_txt(content)
def main():
start_page = int(input('请输入查询的开始页码:'))
end_page = int(input('请输入查询的结束页码:'))
# 创建对象,启动程序:
spider = ZhiLianSpider(start_page, end_page)
spider.run()
if __name__ == "__main__":
main()
这样就爬取好了,这里我们还用了最后说的,find, find_all, select不仅适用于soup对象,还适用于其他的子对象,所以我们先找到了 a
标签,又找到 b
标签,最后对b使用方法text
来取出内容。
好啦,直到现在,数据解析也已经差不多学完了,比较一下三种方法,大家可以选一个自己用的舒服的多研究研究。
下面我们要学的就是数据存储了。只有用合适的方式存储数据才可以更好的使用它,我们先学的是 json 和 csv。
我又来要赞了啊,如果觉得可以学到些什么的话,点个赞再走吧,