Python爬虫入门_BeautifulSoup
- Python爬虫入门_BeautifulSoup
1.BeautifulSoup 是什么?
学习官网:https://beautifulsoup.readthedocs.io/zh_CN/latest/
BeautifulSoup 是一个python的工具库,主要用户 爬虫 页面的解析工作,
它支持如下 几种解析方式:
解析方式 | 特性 |
---|---|
html.parser | Python 的内置标准库,执行速度适中,文档容错能力强,Python 2.7.3 or 3.2.2) 前 的版本中文档容错能力差 |
lxml | 速度快,文档容错能力强,需要安装 C 语言库 |
html5lib | 最好的容错性,以浏览器的方式解析文档,生成 HTML5 格式的文档,速度慢,不依赖外部扩展 |
2.BeautifulSoup 的四大对象种类
BeautifulSoup 把 html 的结构转换为 复杂的 树形结构,每个节点都有不同的 类型归属,
所有的 节点 对象 可以分为:
- Tag (节点,同 html 的节点)
- NavigableString (获取标签内 文本 的对象, 获取方式 tag.string)
- BeautifulSoup (特殊的 Tag 对象)
- Comment (标识 HTML 和 XML 中的注释)
3.BeautifulSoup 安装
pip3 install beautifulsoup4
#lxml 解析器
pip3 install lxml
4. BeautifulSoup 对象 如何使用?
创建 BeautifulSoup 对象,它本身是一个 特殊的tag 对象。
import bs4
import requests
from bs4 import BeautifulSoup
html = requests.get('http://www.qiman6.com/rank/1-1.html')
# 设定了解析器为 html.parser,Python 的内置标准库,执行速度适中,文档容错能力强
soup = BeautifulSoup(html.text,'html.parser')
# 格式化输出
def prettifyPrint():
print(soup.prettify())
5.Tag 对象 的使用
常用方法,配上详细注释,建议 逐个运行查看效果,最后 做实战案例,事半功倍。
# tag 相关操作
def tagHandler():
#获取第一个 div
print(soup.div)
#获取标签名称
print(soup.div.name)
#获取第一个 a 标签的 标签中的内容 <a>测试内容</a>
print(soup.a.string)
#获取 标签 的父标签 的 标签名称
print(soup.a.parent.name)
#获取 第一个标签的 class 名称
print(soup.div['class'])
#获取所有div 标签,返回一个 set 集合对象
print(soup.find_all('div'))
#通过id 查询匹配的元素
print(soup.find(id='11'))
#获取 所有 文字
print(soup.get_text())
# tag 对象 通过 attrs 获取属性
def attrsHandler():
# 获取元素的属性 Attributes -两种使用方式--返回的是 list 因为 可能有多个值
print(soup.div.attrs['class'])
print(soup.div.get('class'))
print(type(soup.name))
# #<type 'unicode'>
print(soup.name)
# [document]
print(soup.attrs)
# {} 空字典
# tag 获取直接子节点 和 获取子孙节点递归 对象循环操作
def itemCycle():
#循环元素
a_set = soup.find_all('a')
for item in a_set:
print(item['href'])
print(item.get('href'))
# .content 属性可以将 tag 的子节点以列表的方式输出
print(soup.head.contents)
# 返回一个迭代器
print(soup.children)
# 利用迭代器 循环打印子节点
for item in soup.children:
print(item)
# 同样返回 迭代器,但是 是对 tag 所有子孙标签的 递归循环
for item in soup.descendants:
print(item)
6. string 对象的使用
string 的常用方法
# string 对象 相关操作
def stringHandler():
# 获取到 a 标签内的 文字(包含 注释-并会自动把注释符号去掉)
print(soup.p)
# 判断不是 Comment(含有注释的string) 类型才打印
# if type(soup.p.a.string)!=bs4.element.Comment:
# print(soup.p.a.string)
# 获取到 所有 标签中的文字,可以便利打印出来
for item in soup.strings:
print(item)
# 获取到 所有 标签中的文字,可以便利打印出来--可以去除多余空白内容
for item in soup.stripped_strings:
print(item)
7.Comment 对象 的应用场景
局部代码, 相信 大致意思 都懂了
# 判断不是 Comment(含有注释的string) 类型才打印
# if type(soup.p.a.string)!=bs4.element.Comment:
# print(soup.p.a.string)
8.父子节点 / 兄弟节点 操作
使用场景 主要为 获取当前 对象的 父辈/兄弟/前后/孙子 节点操作
8.1 获取当前节点的父辈节点
def parentHandler():
print(soup.div.parent)
# 获取到 元素的所有 父辈节点
for item in soup.div.parents:
print(item.name)
8.2 获取兄弟节点
# 兄弟节点的相关操作
def brothersHandler():
# .next_sibling 属性获取了该节点的下一个兄弟节点,空格或换行也可能被视为 一个节点
print(soup.div.next_sibling)
# 获取上一个
print(soup.div.prev_sibling)
# 全部兄弟节点 next_siblings previous_siblings
for item in soup.div.next_siblings:
print(item)
8.3 获取前后节点
# 前后节点的操作- 不分层级,只论前后-空格或换行也可能被视为 一个节点
def elementHandler():
print(soup.head.next_element.next_element)
# 所有前后节点 .next_elements .previous_elements 属性
for item in soup.head.next_elements:
print(item)
9/10. 强大的搜索命令
9.1 标签名称搜索
def searchHandler(): # A. 传标签名称的方式,返回一个 <class 'bs4.element.ResultSet'> 对象 print(soup.find_all('div')) # B. 匹配多个 print(soup.find_all(['a','img']))
9.2 正则表达式搜索
def searchHandler(): print(soup.find_all(re.compile("^b")))
9.3 True 搜索
传 True True 可以匹配任何值,下面代码查找到所有的 tag, 但是不会返回字符串节点
for tag in soup.find_all(True): print(tag.name)
9.4 属性持有 搜索
# 搜索有 id 属性的节点def has_id(tag): return tag.has_attr('id')# 方法作为参数 搜索 print(soup.find_all(has_id))
9.5 属性值搜索
常规属性条件搜索
print(soup.find_all(id='Icon_m_header_searchBtn'))print(soup.find_all(href='/18766/'))print(soup.find_all(class_='header',id='header'))
有些 tag 属性在搜索不能使用,比如 HTML5 中的 data-* 属性
print(soup.find_all(attrs={"data-foo": "value"}))
按text 文字搜索,支持 文字、列表、True or false、正则表达式
print(soup.find_all(text='至尊瞳术师:绝世大小姐'))print(soup.find_all(text=['斗罗大陆4终极斗罗','我身上有条龙']))
9.6 搜索分页
print(soup.find_all(class_='item ib',limit=1))
9.7 搜索直接子节点
print(soup.find_all(class_='logo ib fl')[0].find_all('a'),recursive=True)
10 CSS 选择器搜索
10.1 标签名称搜索
标签名称搜索-返回一个 list
print(soup.select('a'))
10.2 按类名称搜索
使用方式和前端的写法一致,返回一个 list
print(soup.select('.logo'))
10.3 按 id 搜索
使用方式和前端的写法一致,返回一个 list
print(soup.select('#Icon_m_header_searchBtn'))
10.4 组合搜索
组合查找,空格 分割
print(soup.select('span #Icon_m_header_searchBtn'))print(soup.select('span a[title="元尊漫画"]'))
10.5 定向搜索
直接查找子标签,注意两边都要空格
print(soup.select('head > meta'))
10.6 按属性值搜索
按属性值搜索
print(soup.select('a[title="元尊漫画"]'))
耐心坚持 end
努力了的才叫梦想,不努力的就是空想!如果你一直空想的话,无论看多少正能量语录,也赶不走满满的负能量!你还是原地踏步的你,一直在看别人进步的你。
评论区