目 录CONTENT

文章目录

Python爬虫入门_BeautifulSoup

小张的探险日记
2021-09-07 / 0 评论 / 0 点赞 / 586 阅读 / 4,586 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2021-09-07,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

Python爬虫入门_BeautifulSoup


1.BeautifulSoup 是什么?

学习官网:https://beautifulsoup.readthedocs.io/zh_CN/latest/

BeautifulSoup 是一个python的工具库,主要用户 爬虫 页面的解析工作,

它支持如下 几种解析方式:

解析方式特性
html.parserPython 的内置标准库,执行速度适中,文档容错能力强,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

努力了的才叫梦想,不努力的就是空想!如果你一直空想的话,无论看多少正能量语录,也赶不走满满的负能量!你还是原地踏步的你,一直在看别人进步的你。

0

评论区