爬虫基础——beautifulsoup
概念:
beautifulSoup提供一些简单的、python式的函数用来处理导航、搜索、修改分析树等功能。它是一个工具箱,通过解析文档为用户提供需要抓取的数据,因为简单,所以不需要多少代码就可以写出一个完整的应用程序。
Beautiful Soup自动将输入文档转换为Unicode编码,输出文档转换为utf-8编码。你不需要考虑编码方式,除非文档没有指定一个编码方式,这时,Beautiful Soup就不能自动识别编码方式了。然后,你仅仅需要说明一下原始编码方式就可以了。
Beautiful Soup已成为和lxml、html6lib一样出色的python解释器,为用户灵活地提供不同的解析策略或强劲的速度。
将复杂的html文档转换成一个复杂的树形结构,每个节点都是python对象,所有对象可以归纳为4种
beautifulsoup4
-tag
-navigableString
-beautifulsoup
-comment
'''
导入包+解析网页
BeautifulSoup支持Python标准库中的HTML解析器,还支持一些第三方的解析器,如果我们不安装它,则 Python 会使用 Python默认的解析器,lxml 解析器更加强大,速度更快,推荐使用lxml 解析器。
from bs4 import BeautifulSoup
import re #正则表达式的包
file=open("./renwu.html","rb") #rb表示以二进制打开文件用于只读,文件指针放在文件开头
html=file.read().decode("utf-8") #文件操作,读取
bs=BeautifulSoup(html,"html.parser")#使用html.parser解析器解析html文档
bs对象
print(bs.title) #打印所有title标签
print(bs.a)
print(bs.head)
print (bs.prettify()) #打印 soup 对象的内容,格式化输出
#1111属性为tag,包含标签及其内容:但是只能找到它能拿到的第一个内容
print(type(bs.head)) #<class 'bs4.element.Tag'>
#22222此类型为NavigableString,表示为标签里的内容
print(bs.title.string) # 此为任务1
print(type(bs.title.string)) # <class 'bs4.element.NavigableString'>
#3333此类型为beautifulsoup
print(type(bs)) # <class 'bs4.BeautifulSoup'>
#拿到键与属性值
print(bs.a.attrs) # {'href': '#'}
#4444此类型为comment,拿到注释里面的内容
print(bs.a.string) # 导航链接1
bs中常用文档遍历方法
print(bs.head.contents) #将访问的head里面的元素以列表形式输出
print(bs.head.contents[1])
#关于文档内容的遍历更多内容请搜索BeautifulSoup文档
#文档的搜索
#find_all直接查找所有
#111111字符串过滤,查找所有与字符串完全匹配的内容
t_list=bs.find_all("a") #将所有超链接放到同一个列表里面
#222222正则表达式搜索,使用search()方法来匹配内容
t_list=bs.find_all(re.compile("a")) #re.compile表示编译一个正则表达式对象
print(t_list)
#33333方法:传入一个函数,根据函数的方法来搜索
def name_is_sxists(tag):
return tag.has_attr("name")
t_list=bs.find_all(name_is_sxists)
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=re.compile("\d")) #应用正则表达式来寻找包含特定文本里面的内容
selector 选择器
t_list=bs.select('title') #通过标签来查找
t_list=bs.select(".mnav") #通过类名来查找(mnav类) 前面加上'.'
t_list=bs.select("#u1") #通过id来查找 前面加上'#'
t_list=bs.select("a[class='bri']") #通过属性来查找
t_list=bs.select("head > title") #通过子标签来查找
**find_all( name , attrs , recursive , text , kwargs )
标签名,标签属性