# -*- coding:utf-8 -*-
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(type(bs.prettify()))
print(type(bs))
print(bs.head)
# 类型是Tag bs4.element.Tag子节点
print(type(bs.head))
#name 字节的名称,bs.name获取得到是【document】文件
# 对于a\p\div 等标签来数,获取的就是标签的名称
print(bs.name)
print(bs.title.name)
# 字符串
print(type(bs.title.name))
# # attrs获取标签节点的属性。返回的是一个key:values的字典,如果属性有多个值返回的是列表
print(bs.a.attrs)
# #获取某一个属性值
print(bs.a['href'])
print(bs.a["class"])
# #<class 'bs4.element.NavigableString'> 类型 节点之间的text文本
print(bs.a.string)
print(type(bs.a.string))
#
# # bs4 使将html代码转换为一个python对象(BeautifulSoup)
# # Tag : 指的就是html 中的一个标签(包含开始标签和结束标签在内的整个标签),name。attrs,
# # string
# # NavigableString :指的是标签中的文本,不包含标签
print(bs.head.contents)
# content 获取直接子节点,返回一个列表
print(bs.body.contents)
# 根据索引从所有节点中取出某一个
title = bs.head.contents[3]
print(title)
print(title.string)
# children 返回的是列表生成器
res = bs.body.children
for ele in res:
print("*****")
print(ele)
#descendants 获取子孙节点(包含子节点,子节点的子节点,每个节点的内容),返回的 结果是一个生成器对象
res = bs.body.descendants
for ele in res:
print("...")
print(ele)
# 获取节点的父节点
print(bs.title.parent)
# next_sibling 获取节点的下一个兄弟节点 \n 是一个字节
print(bs.meta.next_sibling.next_sibling)
# previous_sibling 获取节点的上一个兄弟节点
print(bs.title.previous_sibling.previous_sibling)
# # 搜索 文档树中的数据
res = bs.find_all("p")
print(res)
# # 可以根据多个标签名查找
es = bs.find_all(["p", "a"])
print(es)
# find()函数查找唯一标签
# find_all()
#通过class类名查找。不能直接写class 因为class是python关键字,使用class_代替
print(bs.find_all(class_="two"))
# 2 通过css 选择器 查找标签,返回时一个列表,列表中存放是要查找的标签
# # 代表是ID .表示class
print(bs.select('#data'))
print(bs.select('.two'))
# 找到指定的标签
print(bs.select('a[target="_blank"]'))
# 找到某个标签下的指定属性值的标签
print(".....")
#.表示class
print(bs.select('div .spider'))
print(bs.select('div #data'))
"""
"""
查找的网页位置
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>bs4测试网页</title>
<style>
<!--css选择器-->
#web span{
color: red;
}
/*#id .class*/
/*p span 后代选择器*/
/*p>span 直接子标签*/
</style>
</head>
<body>
<a href="http://www.baidu.com" id="top" class="one two three" target="_blank">百度一下</a>
<p class="spider">qwertyui</p>
<div>
<p class="spider">Python爬虫工程师</p>
<p id="web">Python后台工程<span>123456</span></p>
<p id="data" class="two">数据分析工程师</p>
</div>
<a href="#" target="_blank">123</a>
<a href="#">456</a>
</body>
</html>