我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Python爬虫笔记4-Beautif

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Python爬虫笔记4-Beautif

BeautifulSoup介绍

lxml一样,BeautifulSoup也是一个HTML/XML的解析器,主要功能也是如何解析和提取HTML/XML数据。

几种解析工具的对比

工具 速度 难度
正则表达式 最快 困难
BeautifulSoup 最简单
lxml 简单
lxml 只会局部遍历,而Beautiful Soup 是基于HTML DOM的,会载入整个文档,解析整个DOM树,因此时间和内存开销都会大很多,所以性能要低于lxml。

安装
我的环境是Python 3.6.5,windows下cmd里执行pip安装即可。

pip3 install beautifulsoup4

测试
python终端里导入beautifulsoup,无报错信息即安装成功。

>>from bs4 import BeautifulSoup
>>

BeautifulSoup对象

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

  • Tag
  • NavigableString
  • BeautifulSoup
  • Comment

BeautifulSoup 对象表示的是一个文档的内容。大部分时候,可以把它当作 Tag 对象,是一个特殊的 Tag。
Comment 对象是一个特殊类型的 NavigableString 对象,其输出的内容不包括注释符号。

Tag

Tag可以简单理解为HTML文档中的一个个的标签,比如:

<head><title>The Dormouse's story</title></head>
<ur><li class="item-0"><a href="link1.html">first item</a></li></ur>

上面HTML文档中的head、title、ur、li都是HTML标签(节点名称),这些标签加上里面的内容就是tag。

获取Tags

# 导入模块
from bs4 import BeautifulSoup

html = """
<html><head><title>The Dormouse's story</title></head>
<body>
<p class="title" name="dromouse"><b>The Dormouse's story</b></p>
<p class="story">Once upon a time there were three little sisters; and their names were
<a href="http://example.com/elsie" class="sister" id="link1"><!-- Elsie --></a>,
<a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
<a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
and they lived at the bottom of a well.</p>
<p class="story">...</p>
"""
# 初始化BeautifulSoup对象,指定lxml解析器
soup = BeautifulSoup(html, 'lxml')

# prettify()方法格式化soup的内容
print(soup.prettify())

# soup.title选出title节点
print(soup.title)
# <title>The Dormouse's story</title>

print(type(soup.title))
# <class 'bs4.element.Tag'>

print(soup.head)
# <head><title>The Dormouse's story</title></head>

print(soup.p)
# <p class="title" name="dromouse"><b>The Dormouse's story</b></p>

说明:使用soup加节点名称可以获取节点内容,这些对象的类型是bs4.element.Tag,但是它查找的是在内容中第一个符合要求的节点。比如上面代码有多个p标签,但是它只查找了第一个p标签。

对于Tag有两个重要的属性,nameattrs。当选择一个节点后,name属性获取节点的名称,attrs属性获取节点的属性(以字典形式返回)。

print(soup.name)
# [document] #soup 对象本身比较特殊,它的 name 即为 [document]
print(soup.head.name)
# head #对于其他内部标签,输出的值便为标签本身的名称
    
print(soup.p.attrs)
# {'class': ['title'], 'name': 'dromouse'}
# 在这里,我们把 p 标签的所有属性打印输出了出来,得到的类型是一个字典。

# 下面三种方法都可以获取字典里的值,是等价的,结果都一样
print(soup.p.get('class'))
# ['title']
print(soup.p['class'])
# ['title']
print(soup.p.attrs['class'])
# ['title']

# 还可以针对属性或者内容进行修改
soup.p['class'] = "newClass"
print (soup.p)
# <p class="newClass" name="dromouse"><b>The Dormouse's story</b></p>

NavigableString

获取了Tag,也就是获取了节点内容,但是只想要获取节点内部的内容怎么办?只需使用.string即可。


# 获取节点内容
print(soup.p.string)
# The Dormouse's story

print(type(soup.p.string))
# <class 'bs4.element.NavigableString'>

遍历文档树

在选取节点的时候,也可以先选取一个节点,然后以这个节点为基准选取它的子节点,父节点,子孙节点等等,下面就介绍常用的选取方法。

获取直接子节点.contents .children属性

.contents

tag的.contents属性可以将tag的直接子节点以列表的方式输出。
下面例子选取head节点为基准,.contents选取head的子节点title,然后以列表返回。

print(soup.head.contents)
# [<title>The Dormouse's story</title>]

输出方式为列表,可以用列表索引来获取它的某一个元素.

print(soup.head.contents[0])
# <title>The Dormouse's story</title>

.children

children属性和contents属性不同的是它返回的不是一个列表,而是一个生成器。可用for循环输出结果。

print(soup.head.children)
# <list_iterator object at 0x0000017415655588>

for i in soup.head.children:
    print(i)
# <title>The Dormouse's story</title>    

获取所有子孙节点:.descendants属性

上面两个属性都只能获取到基准节点的下一个节点,要想获取节点的所有子孙节点,就可以使用descendants属性了。它返回的也是一个生成器。

print(soup.descendants)
# <generator object descendants at 0x0000028FFB17C4C0>

还有其他属性如查找父节点,组父节点的属性就不记录了(平时很少用)。

搜索文档树

BeautifulSoup提供了一些查询方法(find_all,find等),调用对应方法,输入查询参数就可以得到我们想要的内容了,可以理解为搜索引擎的功能。(百度/谷歌=查询方法,查询内容=查询参数,返回的网页=想要的内容)
下面介绍最常用的find_all方法。

find_all方法

作用:查找所有符合条件的元素,返回的是列表形式
API:find_all(name, attrs, recursive, text, **kwargs)
1. name
name 参数可以根据节点名来查找元素。
A. 传字符串
最简单的过滤器是字符串.在搜索方法中传入一个字符串参数,BeautifulSoup会查找与字符串完整匹配的内容,下面的例子用于查找文档中所有的<p>标签

print(soup.find_all('p'))
# 通常以下面方式写比较好
print(soup.find_all(name='p'))

B.传正则表达式
如果传入正则表达式作为参数,Beautiful Soup会通过正则表达式的 match() 来匹配内容.下面例子中找出所有以p开头的标签。

import re
print(soup.find_all(re.compile('^p')))

C.传列表
如果传入列表参数,BeautifulSoup会将与列表中任一元素匹配的内容返回。下面代码会找到HTML代码中的head标签和b标签。

print(soup.find_all(['head','b']))
# [<head><title>The Dormouse's story</title></head>, <b>The Dormouse's story</b>]

2. attrs
find_all中attrs参数可以根据节点属性查询。
查询时传入的参数是字典类型。比如查询id=link1的节点

print(soup.find_all(attrs={'id':'link1'}))
# [<a class="sister" href="http://example.com/elsie" id="link1"><!-- Elsie --></a>]

对于常见的属性,可以不用以attrs来传递,直接传入查询参数即可。比如id,class_(class为Python关键字,使用下划线区分),如下:

print(soup.find_all(id='link1'))
print(soup.find_all(class_='sister'))

运行结果:

[<a class="sister" href="http://example.com/elsie" id="link1"><!-- Elsie --></a>]

[<a class="sister" href="http://example.com/elsie" id="link1"><!-- Elsie --></a>, <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>, <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]

3. text
text 参数可以搜搜文档中的字符串内容,与 name 参数的可选值一样, text 参数接受 字符串 , 正则表达式 , 列表。下面代码查找节点里内容中有story字符串的节点,并返回节点的内容。

print(soup.find_all(text=re.compile('story')))
# ["The Dormouse's story", "The Dormouse's story"]

find方法

find方法与find_all方法的区别:
find_all:查询符合所有条件的元素,返回列表。
find:只查找第一个匹配到的元素,返回单个元素,类型tag。
查询方法与find_all大同小异。示例:

print(soup.find(name='p')) # 查询第一个p标签
print(soup.find(text=re.compile('story'))) # 查找第一个节点内容中有story字符串的节点内容

运行结果:

<p class="title" name="dromouse"><b>The Dormouse's story</b></p>
The Dormouse's story
关于BeautifulSoup的使用就这样吧,常用个人就觉得用好find_all即可(=.=~)

参考链接

崔庆才 [Python3网络爬虫开发实战]:4.2-使用Beautiful Soup

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Python爬虫笔记4-Beautif

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Python爬虫笔记4-Beautif

BeautifulSoup介绍与lxml一样,BeautifulSoup也是一个HTML/XML的解析器,主要功能也是如何解析和提取HTML/XML数据。几种解析工具的对比工具速度难度 正则表达式最快困难 BeautifulSoup慢最简单
2023-01-31

python爬虫笔记-day3

正则使用的注意点re.findall("a(.*?)b","str"),能够返回括号中的内容,括号前后的内容起到定位和过滤的效果原始字符串r,待匹配字符串中有反斜杠的时候,使用r能够忽视反斜杠带来的转义的效果点号默认情况匹配不到\n\s能够
2023-01-31

Python爬虫利器二之Beautif

上一节我们介绍了正则表达式,它的内容其实还是蛮多的,如果一个正则匹配稍有差池,那可能程序就处在永久的循环之中,而且有的小伙伴们也对写正则表达式的写法用得不熟练,没关系,我们还有一个更强大的工具,叫Beautiful Soup,有了它我们可以
2023-01-31

爬虫笔记1:Python爬虫常用库

请求库:1、urllib:urllib库是Python3自带的库(Python2有urllib和urllib2,到了Python3统一为urllib),这个库是爬虫里最简单的库。2、requests:requests属于第三方库,使用起来比
2023-01-31

python简单爬虫笔记

python模拟游览器爬取相关页面import urllib.requesturl="https://blog.51cto.com/itstyle/2146899"#模拟浏览器headers=("User-Agent","Mozilla/5
2023-01-31

Python 爬虫学习笔记之多线程爬虫

XPath 的安装以及使用 1 . XPath 的介绍 刚学过正则表达式,用的正顺手,现在就把正则表达式替换掉,使用 XPath,有人表示这太坑爹了,早知道刚上来就学习 XPath 多省事 啊。其实我个人认为学习一下正则表达式是大有益处的,
2022-06-04

Python 爬虫学习笔记之单线程爬虫

介绍 本篇文章主要介绍如何爬取麦子学院的课程信息(本爬虫仍是单线程爬虫),在开始介绍之前,先来看看结果示意图怎么样,是不是已经跃跃欲试了?首先让我们打开麦子学院的网址,然后找到麦子学院的全部课程信息,像下面这样这个时候进行翻页,观看网址的变
2022-06-04

55. Python 爬虫(4)

webdriverSelenium是ThroughtWorks公司开发的一套Web自动化测试工具。它分为三个组件:Selenium IDESelenium RC (Remote Control)Selenium WebdriverSelen
2023-01-31

Python爬虫笔记3-解析库Xpat

当爬取到Html数据后,可以用正则对数据进行提取,但有时候正则表达式编写起来不方便,而且万一写错了,可能导致匹配失败。这时候就需要借助其他解析工具了。XML引入什么是XML?XML 指可扩展标记语言(EXtensible Markup La
2023-01-31

python3 爬虫笔记(一)beaut

很多人学习python,爬虫入门,在python爬虫中,有很多库供开发使用。用于请求的urllib(python3)和request基本库,xpath,beautiful soup,pyquery这样的解析库。其中xpath中用到大量的正则
2023-01-30

Python爬虫笔记5-JSON格式数

环境:python-3.6.5JSONJSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,它使得人们很容易的进行阅读和编写。同时也方便了机器进行解析和生成。适用于进行数据交互的场景,比如网站前台与后
2023-01-31

Python爬虫4-URLError与H

GitHub代码练习地址:URLError:https://github.com/Neo-ML/PythonPractice/blob/master/SpiderPrac06_URLError.py           HTTPError:
2023-01-30

Python的Scrapy爬虫框架简单学习笔记

一、简单配置,获取单个网页上的内容。 (1)创建scrapy项目scrapy startproject getblog(2)编辑 items.py# -*- coding: utf-8 -*-# Define here the models
2022-06-04

Python 爬虫学习笔记之正则表达式

正则表达式的使用 想要学习 Python 爬虫 , 首先需要了解一下正则表达式的使用,下面我们就来看看如何使用。 . 的使用这个时候的点就相当于一个占位符,可以匹配任意一个字符,什么意思呢?看个例子就知道import re content
2022-06-04

python爬虫学习笔记--BeautifulSoup4库的使用详解

目录使用范例常用的对象–Tag常用的对象–NavigableString常用的对象–BeautifulSoup常用的对象–Comment对文档树的遍历tag中包含多个字符串的情况.stripped_strings 去除空白内容搜索文档树–f
2022-06-10

Python 学习笔记 (4)—— 模块

模块基本上就是一个包含了所有你定义的函数和变量的文件。为了在其他程序中重用模块,模块的文件名必须以.py为扩展名。        模块可以从其他程序 输入 以便利用它的功能。这也是我们使用Python标准库的方法。首先,我们将学习如何使用标
2023-01-31

Python学习笔记4——函数

函数1 # 函数需要先定义,关键字 def2 def func():3 print("我是一个函数")4 5 # 函数的调用6 func()执行结果:我是一个函数内建函数(内置函数)help(), print(), format()
2023-01-30

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录