Python爬虫笔记(BeautifulSoup模块)

# 创建BeautifulSoup对象
from bs4 import BeautifulSoup 
file = open('./aa.html', 'rb') 
html = file.read() 
bs = BeautifulSoup(html,"html.parser") 

BeautifulSoup4将复杂HTML文档转换成一个复杂的树形结构,每个节点都是Python对象,所有对象可以归纳为4种:

  1. Tag 通俗点讲就是HTML中的一个个标签,可以利用 soup 加标签名轻松地获取这些标签的内容,这些对象的类型是bs4.element.Tag。但是注意,它查找的是在所有内容中的第一个符合要求的标签。它有两个重要的属性,是 name 和 attrs:
# 获取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)
  1. NavigableString 用 .string 即可获取标签内部的文字
print(bs.title.string) 
print(type(bs.title.string))
  1. BeautifulSoup对象表示的是一个文档的内容。大部分时候,可以把它当作 Tag 对象,是个特殊的 Tag,我们可以分别获取它的类型,名称,以及属性,例如:
print(type(bs.name)) 
print(bs.name) 
print(bs.attrs)
  1. Comment 对象是一个特殊类型的 NavigableString 对象,其输出的内容不包括注释符号。
print(bs.a)
# 此时不能出现空格和换行符,a标签如下:
# 
print(bs.a.string) # 新闻
print(type(bs.a.string)) # 
  1. 文档的遍历(不常用)
   # 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. 文档的搜索(常用)
   #(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)
  1. css选择器
      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)

你可能感兴趣的:(python,python)