1.本文件需要引用的index.html文件代码为:
bs4测试网页
百度一下
qwertyui
python爬虫工程师
python后台工程123456
数据分析工程师
123
456
2. 需要下载bs4包 pip install bs4
引入包
from bs4 import BeautifulSoup
import codecs
3.基本知识
BeautifulSoup 是python支持的一个第三方的包,作用是用来解析html网页,提取数据
lxml 第三方解析包,解析html速度比较快,功能强大,底层是C语言实现的
参数: 1.html源代码 2.解析器lxml
bs跟节点对象
bs = BeautifulSoup(codecs.open('index.html', 'r', encoding='utf-8'), 'lxml')
4.三种类型
4.1.bs是BeautifulSoup类型的对象
# print(bs.prettify()) # 和print(bs)输出结果一样
# print(type(bs))
4.2.
print(bs.title)
print(type(bs.title))
print(bs.head.title)
name 节点的名称 ,bs.name获取到的是[document]
对于a \p \div等标签来说,获取到的就是标签的名称
print(bs.name)
print(bs.title.name)
attrs 获取标签节点的属性,返回的是一个
key:value形式的字典,如果某个属性有多个值,返回value就是一个列表
print(bs.a.attrs)
获取某一个属性值
print(bs.a['href'])
print(bs.a['id'])
有多个属性值,获取到的是列表
print(bs.a['class'])
print(type(bs.a['class']))
4.3.bs4.element.NavigableString 类型 节点之间的text文本
print(bs.a.string)
print(type(bs.a.string))
bs4 是将html代码转换为一个python对象(BeautifulSoup)
Tag:指的是html中的一个标签(包含开始标签和结束标签在内的整个标签) name,attrs,string
NavigableString:指的就是标签中的文字,不包含标签
5.常用的属性
contents获取直接子节点,返回的是一个列表
print(bs.contents)
print(bs.head.contents)
print(bs.body.contents)
根据索引从所有节点中取出某一个
title = bs.head.contents[3]
print(title.string)
children返回的是一个列表生成器对象
res = bs.head.children
# print(res)
# for循环遍历子节点 ele 就是子节点
for ele in res:
print(ele)
descendants获取子孙节点(包含子节点,子节点的子节点,每个子节点的内容),返回的结果是一个生成器对象
print(bs.body.descendants)
res = bs.body.descendants
for ele in res:
print(ele)
获取子节点的父节点
print(bs.title.parent)
next_sibling获取节点的下一个兄弟节点
print(bs.meta.next_sibling.next_sibling)
previous_sibling获取节点的上一个兄弟节点
print(bs.title.previous_sibling.previous_sibling)
搜索文档中的数据
直接通过标签名 查找标签
res = bs.find_all('p')
print(res)
可以同时根据多个标签名查找标签
res = bs.find_all(['a', 'p', 'title'])
print(res)
find()函数 查找唯一标签
print(bs.find(id='top'))
# find_all()
通过
class类名查找,不能直接写class,因为class是python关键字 使用
class_代替class
print(bs.find_all(class_='two'))
6.法一:通过css选择器查找标签,返回的是列表,列表中存放的是查找到的标签
print(bs.select('#data'))
print(bs.select('#web span'))
print(bs.select('.two'))
法二:找到指定标签 指定属性值
print(bs.select('a[target="_blank"]'))
法三:找到某个标签下的 指定属性值的标签
print(bs.select('div .spider'))
print(bs.select('.spider'))
完整代码:
# -*- coding:utf-8 -*-
# 需要下载bs4包 pip install bs4
# lxml
from bs4 import BeautifulSoup
import codecs
# BeautifulSoup 是python支持的一个第三方的包,作用是用来解析html网页,提取数据
# lxml 第三方解析包,解析html速度比较快,功能强大,底层是C语言实现的
# 1.html源代码 2.解析器lxml
# bs跟节点对象
bs = BeautifulSoup(codecs.open('index.html', 'r', encoding='utf-8'), 'lxml')
# 1.bs是BeautifulSoup类型的对象
# print(bs.prettify()) # 和print(bs)输出结果一样
# print(type(bs))
print(bs.title)
# 2. 子节点的类型
print(type(bs.title))
print(bs.head.title)
# name 节点的名称 ,bs.name获取到的是[document]
# 对于a \p \div等标签来说,获取到的就是标签的名称
print(bs.name)
print(bs.title.name)
# attrs 获取标签节点的属性,返回的是一个 key:value形式的字典,如果某个属性有多个值,返回value就是一个列表
print(bs.a.attrs)
# 获取某一个属性值
print(bs.a['href'])
print(bs.a['id'])
# 有多个属性值,获取到的是列表
print(bs.a['class'])
print(type(bs.a['class']))
print('----------------------------------------')
print(bs.a.string)
# 3.bs4.element.NavigableString 类型 节点之间的text文本
print(type(bs.a.string))
# bs4 是将html代码转换为一个python对象(BeautifulSoup)
# Tag:指的是html中的一个标签(包含开始标签和结束标签在内的整个标签) name,attrs,string
# NavigableString:指的就是标签中的文字,不包含标签
# contents获取直接子节点,返回的是一个列表
print(bs.contents)
print(bs.head.contents)
print(bs.body.contents)
# 根据索引从所有节点中取出某一个
title = bs.head.contents[3]
print(title.string)
# children返回的是一个列表生成器对象
res = bs.head.children
# print(res)
# for循环遍历子节点 ele 就是子节点
for ele in res:
print(ele)
# descendants获取子孙节点(包含子节点,子节点的子节点,每个子节点的内容),返回的结果是一个生成器对象
print(bs.body.descendants)
res = bs.body.descendants
for ele in res:
print(ele)
# 获取子节点的父节点
print(bs.title.parent)
print('===================================')
# next_sibling获取节点的下一个兄弟节点
print(bs.meta.next_sibling.next_sibling)
# previous_sibling获取节点的上一个兄弟节点
print(bs.title.previous_sibling.previous_sibling)
# 搜索文档中的数据
# 直接通过标签名 查找标签
res = bs.find_all('p')
print(res)
#可以同时根据多个标签名查找标签
res = bs.find_all(['a', 'p', 'title'])
print(res)
# find()函数 查找唯一标签
print(bs.find(id='top'))
# find_all()
# 通过class类名查找,不能直接写class,因为class是python关键字 使用class_代替class
print(bs.find_all(class_='two'))
# 2.通过css选择器查找标签,返回的是列表,列表中存放的是查找到的标签
print(bs.select('#data'))
print(bs.select('#web span'))
print(bs.select('.two'))
# 找到指定标签 指定属性值
print(bs.select('a[target="_blank"]'))
# 找到某个标签下的 指定属性值的标签
print(bs.select('div .spider'))
print(bs.select('.spider'))
'''
图片下载,使用bs4解析数据,并且将图片下载进行分类存放
'''
运行结果: