1.Beautiful Soup简介
2.Beautiful Soup安装
3.Beautiful Soup解析库
4.Beautiful Soup四大对象种类
5.Beautiful Soup使用示例----遍历文档树,搜索文档树和CSS选择器
1.Beautiful Soup简介
Beautiful Soup是一个可以从HTML或XML文件中提取数据的Python库. 它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式.
2.Beautiful Soup安装
pip3 install beautifulsoup4
Beautiful Soup支持Python标准库中的HTML解析器,也支持一些第三方的解析器,推荐用lxml,速度快
pip3 install lxml
3.Beautiful Soup解析库
序号 | 解析库 | 使用方法 | 优势 | 劣势 |
---|---|---|---|---|
1 | Python标准库 | BeautifulSoup(html,’html.parser’) | Python内置标准库;执行速度适中,文档容错能力强 |
Python 2.7.3 or 3.2.2前的版本容错能力较差 |
2 | lxml HTML解析库 | BeautifulSoup(html,’lxml’) | 速度快;容错能力强 | 需要安装,需要C语言库 |
3 | lxml XML解析库 | BeautifulSoup(html,[‘lxml’,’xml’]) |
速度快,唯一支持XML的解析器 |
需要C语言库 |
4 | htm5lib解析库 | BeautifulSoup(html,’htm5llib’) | 以浏览器方式解析,最好的容错性,生成HTML5格式的文档 | 速度慢,不依赖外部扩展 |
4.Beautiful Soup四大对象种类(Tag,NavigableString,BeautifulSoup,Commen)
4.1 Tag
id和class选择器, class比较特殊, 因为是关键字 在使用class时改成class_
使用 .属性名 的方法, 但是只能获取到一个
使用元素.attrs['属性名']的方法返回的时一个列表
如果使用两次 soup.元素 第一次获取的是匹配到的第一个元素, 第二次是匹配到的第二个元素
获取多个元素
find方法获取一个元素
find_all获取多个元素, 可以加上limit来达到限制个数的问题, recursive = True 寻找子孙 ; recursive = False只找子
多层级查找 find_all返回的是一个列表 可以遍历该列表再次使用find方法或者find_all方法 进行元素的获取
print(soup.find(id='a')) print(soup.find('a', id='a')) print(soup.find_all('a', id='a')) # 可以使用下标查询 # class是关键字 要这么写class_ print('class1', soup.find_all('a', class_='a')) print('class2', soup.find_all('a', attrs={'class': 'item'})) # 更通用 print('class3', soup.find_all('a', attrs={'class': 'item', 'id': 'a'})) # 多条件
获取标签及一个子标签
print(soup.li.get_text()) # 匹配到第一个,返回所有节点的文本信息 print(soup.find('li').text) # 获取ul的子标签们 (空行也看成了一个children) print(soup.ul.children) for index, item in enumerate(soup.ul.children): print(index, item)
获取标题内容
print(soup.title) # <title>xPath方法</title> # 获取标题内容 print(soup.title.string) # 返回迭代器 print(soup.title.text) print(soup.title.get_text()) print(soup.find('title').get_text())
通过上下级获得对象
# print(soup.title.parent) # 返回父节点包括父节点中的内容 print(soup.li.child) # Node print(soup.li.children) # 返回一个迭代器
使用函数作为参数, 返回元素
def check_tag_existed(tag): if tag == 'a': return True print(soup.find_all(class_=check_tag_existed))
使用find_all()方法通过标签名称查找a标签
print('所有a标签的内容:', soup.find_all('a')) # 使用find_all()方法通过标签名称查找a标签,返回的是一个列表类型 print('a标签和b标签的内容:', soup.find_all(['a', 'b'])) # 把a标签和b标签作为一个列表传递,可以一次找到a标签和b标签
使用select选择器,找到div标签中,id=‘nav_menu’的导航条
print('抓取导航,实现方法1') for item in soup.select('div#nav_menu a'): print(item.get('href'), item.string) print('抓取导航,实现方法2') for item in soup.find('div', {'id':'nav_menu'}).children: print(item['href'], item.string)
获取友情链接
#<div class="link-list friend-link" id="friend_link">
#<a href="//www.aliyun.com" target="_blank">阿里云</a>
#<a href="//cloud.tencent.com" target="_blank">腾讯云</a>
#</div>
print(soup.find('div', {'class':{'link-list','friend-link'}}))
4.2 NavigableString
4.3 BeautifulSoup
4.4 Comment
5.Beautiful Soup使用示例----遍历文档树,搜索文档树和CSS选择器