from bs4 import BeautifulSoup
'''
BeautifulSoup中文官方文档地址: https://beautifulsoup.readthedocs.io/zh_CN/v4.4.0/
BeautifulSoup4是爬虫必学的技能。BeautifulSoup最主要的功能是从网页抓取数据,
Beautiful Soup自动将输入文档转换为Unicode编码,输出文档转换为utf-8编码。
BeautifulSoup支持Python标准库中的HTML解析器,还支持一些第三方的解析器,
如果我们不安装它,则 Python 会使用 Python默认的解析器,lxml 解析器更加强大,速度更快,推荐使用lxml 解析器。
BeautifulSoup4和 lxml 一样,Beautiful Soup 也是一个HTML/XML的解析器,主要的功能也是如何解析和提取 HTML/XML 数据。
BeautifulSoup4将复杂HTML文档转换成一个复杂的树形结构,每个节点都是Python对象,所有对象可以归纳为4种:
1.Tag: Tag通俗点讲就是HTML中的一个个标签
2.NavigableString: 已经得到了标签的内容,那么问题来了,我们要想获取标签内部的文字怎么办呢?很简单,用 .string 即可
3.BeautifulSoup: BeautifulSoup对象表示的是一个文档的内容。大部分时候,可以把它当作 Tag 对象,是一个特殊的 Tag,我们可以分别获取它的类型,名称,以及属性
4.Comment: Comment 对象是一个特殊类型的 NavigableString 对象,其输出的内容不包括注释符号
'''
# 打开百度首页的html源码
file = open('./html_doc.html', 'r', encoding='utf-8')
html_doc = file.read()
# 实例化创建一个bs4对象,指定使用lxml解析器进行解析
soup = BeautifulSoup(html_doc, 'lxml')
# 通过Tag标签获取文档数据
# print(soup.prettify()) # 格式化html结构
# print(soup.title) # 获取title标签的名称
# print(soup.title.name) # 获取title标签的name
# print(soup.title.string) # 获取title标签内的文本
# print(soup.title.text) # 同上
# print(soup.head) # 获取head标签的所有内容
# print(soup.div) # 获取第一个div标签中的所有内容
# print(soup.div["id"]) # 获取第一个div标签的id的值
# print(soup.a) # 获取第一个a标签中的所有内容
# print(soup.a.next_sibling.next_sibling) # 获取第二个a标签中的所有内容
# print(soup.a['class']) # 获取第一个a标签中的class属性的值
# 通过搜索获取页面中的标签
# print(soup.find_all("a")) # 获取所有的a标签
# print(soup.find(id="news")) # 获取id="news"的所有内容
# for item in soup.find_all("a"):
# print(item.get("href")) # 获取所有的a标签,并遍历打印a标签中的href的值
# for item in soup.find_all("a"):
# print(item.get_text()) # 获取所有的a标签,并遍历打印a标签中的文本
# # print(item.text)
# 对于 Tag,它有两个重要的属性,是 name 和 attrs
# print(soup.title.name) # 获取title标签的name
# print(soup.a.attrs) # 将第一个a 标签的所有属性打印输出了出来,得到的类型是一个字典
# print(soup.a.next_sibling.next_sibling.attrs) # 将第二个a 标签的所有属性打印输出了出来,得到的类型是一个字典
# print(soup.a["class"]) # 获取第一个a标签中的class属性的值
# soup.a["class"] = "newClass" # 对这些属性和内容等等进行修改
# print(soup.a)
# 还可以对这个属性进行删除
# del soup.a['class'] # 删除a标签的class属性
# print(soup.find_all('a'))
# 通过NavigableString获取标签内部的文字
# print(soup.title.string)
# print(soup.a.string)
# Css选择器
# BeautifulSoup支持发部分的CSS选择器,在Tag获取BeautifulSoup对象的.select()方法中传入字符串参数,即可使用CSS选择器的语法找到Tag
#
# 通过标签名查找
# print(soup.select('title'))
# print(soup.select('a'))
#
# 通过类名(class属性)查找,在类的前面加一个点“.”
# print(soup.select('.mnav'))
#
# 通过id查找,在id名字前加 “#”
# print(soup.select('#news'))
# print(soup.select('#u1'))
#
# 通过组合查找,通过标签名和类名、id名进行组合,要用空格分开
# print(soup.select('div .bri'))
#
# 通过属性查找,属性需要用中括号括起来
# 属性和标签属于同一节点,所有中间不能加空格,否则无法匹配到
# print(soup.select('a[class="bri"]'))
# print(soup.select('a[href="http://tieba.baidu.com"]'))
#
# 通过直接子标签查找,用>分割
# print(soup.select('body > div'))
#
# 通过兄弟节点标签查找,用 ~ 分隔
# print(soup.select('.mnav ~ .bri'))
#
# 获取内容
# title = soup.select('title')
# print(soup.select('title')[0].get_text())