# -*- coding:utf-8 -*-

# 需要下载bs4包 pip install bs4
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')
# bs 是BeautifulSoup 类型的对象
# print(bs)
print(bs.head)
# bs4.element.Tag 子节点
print(type(bs.body))

# name:节点的名称,bs.name获取到的是document
# 对于a \ p \ div等标签来说,获取到的就是标签的名称
print(bs.name)
print(bs.title.name)

# attrs 获取标签节点的属性,返回的是一个key:value形式的字典,如果某个属性有多个值,返回value就是一个列表
print(bs.a.attrs)
print('****--******')
# 获取某一个属性值
print(bs.a['href'])
print(bs.a['id'])
# 如果有多个属性值,得到的是一个列表
print(bs.a['class'])

# 获取节点之间的text文本
print(bs.a.string)
#-------------------------------------------------------
# bs4 是将html代码转换为一个python对象(BeautifulSoup)
# Tag:指的就是html中的一个标签(包含开始标签和结束标签在内的整个标签)name,attrs,string
# NavigableString:指的就是标签中的文字,不包含标签
#-------------------------------------------------------

# contents 获取直接子节点,返回的是一个列表
print(bs.head.contents)
print(bs.body.contents)

# 根据索引从所有节点中取出某一个
title = bs.head.contents[3]
print(title.string)

# children 返回的是列表生成器对象
res = bs.head.children
# for循环遍历子节点,ele就是子节点
for ele in res:
    print(ele)

# descendants 获取子孙节点(包含子节点,孙节点,每一个子节点的内容),返回的结果也是一个生成器对象
res = bs.body.descendants
for ele in res:
    print(ele)

# parent 获取子节点的父节点
print(bs.title.parent)
#========================================================
# next_sibling获取节点的下一个兄弟节点
print(bs.meta.next_sibling.next_sibling)
# previous_sibling获取节点的上一个兄弟节点
print(bs.meta.next_sibling.next_sibling)

# 搜索文档树种的数据
# 直接通过标签名 查找标签
res = bs.find_all('p')
print(res)
# find_all() 可以同时根据多个标签名查找标签
res = bs.find_all(['a','p','title'])
print(res)
print('-------------------------------------------')
# find()函数 查找唯一标签
print(bs.find(id='top'))
# find_all()
# 通过class类名查找,不能直接写class,因为class是python关键字,使用class_代替class
print(bs.find_all(class_="two"))
print('**************************************************************')
# 通过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'))