# 创建BeautifulSoup对象
from bs4 import BeautifulSoup
file = open('./aa.html', 'rb')
html = file.read()
bs = BeautifulSoup(html,"html.parser")
BeautifulSoup4将复杂HTML文档转换成一个复杂的树形结构,每个节点都是Python对象,所有对象可以归纳为4种:
# 获取title标签的所有内容
print(bs.title)
# 获取head标签的所有内容
print(bs.head)
# 获取第一个a标签的所有内容
print(bs.a)
# 类型
print(type(bs.a))
# [document] #bs 对象本身比较特殊,它的 name 即为 [document]
print(bs.name)
# head #对于其他内部标签,输出的值便为标签本身的名称
print(bs.head.name)
# 在这里,我们把 a 标签的所有属性打印输出了出来,得到的类型是一个字典。
print(bs.a.attrs)
#还可以利用get方法,传入属性的名称,二者是等价的
print(bs.a['class']) # 等价 bs.a.get('class')
# 可以对这些属性和内容等等进行修改
bs.a['class'] = "newClass"
print(bs.a)
# 还可以对这个属性进行删除
del bs.a['class']
print(bs.a)
print(bs.title.string)
print(type(bs.title.string))
print(type(bs.name))
print(bs.name)
print(bs.attrs)
print(bs.a)
# 此时不能出现空格和换行符,a标签如下:
#
print(bs.a.string) # 新闻
print(type(bs.a.string)) #
# 5.1 .contents:获取Tag的所有子节点,返回一个list
# tag的.content 属性可以将tag的子节点以列表的方式输出
print(bs.head.contents)
# 用列表索引来获取它的某一个元素
print(bs.head.contents[1])
# 5.2、.children:获取Tag的所有子节点,返回一个生成器
for child in bs.body.children:
print(child)
# 5.3、.descendants:获取Tag的所有子孙节点
# 5.4、.strings:如果Tag包含多个字符串,即在子孙节点中有内容,可以用此获取,而后进行遍历
# 5.5、.stripped_strings:与strings用法一致,只不过可以去除掉那些多余的空白内容
# 5.6、.parent:获取Tag的父节点
# 5.7、.parents:递归得到父辈元素的所有节点,返回一个生成器
# 5.8、.previous_sibling:获取当前Tag的上一个节点,属性通常是字符串或空白,真实结果是当前标签与上一个标签之间的顿号和换行符
# 5.9、.next_sibling:获取当前Tag的下一个节点,属性通常是字符串或空白,真是结果是当前标签与下一个标签之间的顿号与换行符
# 5.10、.previous_siblings:获取当前Tag的上面所有的兄弟节点,返回一个生成器
# 5.11、.next_siblings:获取当前Tag的下面所有的兄弟节点,返回一个生成器
# 5.12、.previous_element:获取解析过程中上一个被解析的对象(字符串或tag),可能与previous_sibling相同,但通常是不一样的
# 5.13、.next_element:获取解析过程中下一个被解析的对象(字符串或tag),可能与next_sibling相同,但通常是不一样的
# 5.14、.previous_elements:返回一个生成器,可以向前访问文档的解析内容
# 5.15、.next_elements:返回一个生成器,可以向后访问文档的解析内容
# 5.16、.has_attr:判断Tag是否包含属性
#(1)find all() #字符串过滤:会查找与字符串完全匹配的内容
# t_list = bs.find_all("a")
# 正则表达式搜索:使用search()方法来匹配内容
# t_list = bs.find_all(re.compile("a"))
# 传入一个函数,根据函数的要求来搜索
def name_is_exists(tag):
return tag.has_attr("name")
t_list = bs.find_all(name_is_exists)
for item in t_list:
print(item)
#(2)kwargs 参数
t_list = bs.find_all(id="head")
for item in t_list:
print(item)
#(3)text 参数
# t_list = bs.find_all(text = "hao123")
# t_list = bs.find_all(text = ["hao123","地图"])
# t_list = bs.find_all(text = re.compile("\d")) #应用正则表达式来查找阿包含特定文本的内容(标签里的字符串)
for item in t_list:
print(item)
#(4)limit 参数
t_list = bs.find_all("a",limit=3)
for item in t_list:
print(item)
t_list = bs.select("title") # 通过标签来查找
t_list = bs.select(".mnav") # 通过类名来查找
t_list = bs.select("#u1") # 通过id来查找
t_list = bs.select("a[class='bri']") # 通过属性来查找
t_list = bs.select("head > title") # 通过子标签来查找
t_list = bs.select(".mnav ~ .bri") # 通过兄弟标签来查找# print(t_list[0].get_text())
for item in t_list:
print(item)