Beautiful soup将复杂HTML文档转换成一个复杂的属性结构,每个节点都是python对象,所有对象可归纳为4种Tag,NavigableString,BeautifulSoup,Comment

1.Tag 就是html中的一个个标签

tag有两个重要的属性,name和attrs

2.NavigableString  字符对象

#打印出标签p中的内容

print (soup.p.string)

3.BeautifulSoup 表示的是一个文档的内容

⼤部分时候,可以把它当作Tag 对象, 是⼀个特殊的 Tag

4.Comment 特殊的NavigableString对象

输出的内容不包括注释符号

一、遍历文档树:

1.直接子节点:.contents和.children属性

.conten

tag 的 .content 属性可以将tag的⼦节点以列表的⽅式输出

Print(soup.head.contents)

# [

the domouse’s story]

.children返回的是list对象

print (soup.head.children)

#

for child in soup.body.children:

print (child)

2.所有子孙节点:.descendants

contents 和 .children 属性仅包含tag的直接⼦节点, .descendants 属性可以对所有tag的⼦孙节点进⾏递归循环, 和 children类似, 我们也需要遍历获取其中的内容。

for child in soup.descendants:

print (child)

通过一个例子来更直观的看出三者之间的区别

获取的节点如下

以下代码分别获取了class=‘catListTag’下直接子节点和子孙子节点的信息

运行结果:

D:\PycharmProjects\ImoocInterface\venv\Scripts\python.exe D:/PycharmProjects/ImoocInterface/soup_test.py

-------------------contents-----------------------

['\n',

我的标签

, '\n',

  • Autoit(1)
  • beautifulsoup4(1)
  • debug(1)
  • fiddler(1)
  • grid(1)
  • jdk(1)
  • python logging(1)
  • 进程(1)
  • 模块(1)
  • 线程(1)
  • 更多

, '\n']

-------------------children------------------------

我的标签

  • Autoit(1)
  • beautifulsoup4(1)
  • debug(1)
  • fiddler(1)
  • grid(1)
  • jdk(1)
  • python logging(1)
  • 进程(1)
  • 模块(1)
  • 线程(1)
  • 更多

-------------------descendants-----------------------

我的标签

我的标签

  • Autoit(1)
  • beautifulsoup4(1)
  • debug(1)
  • fiddler(1)
  • grid(1)
  • jdk(1)
  • python logging(1)
  • 进程(1)
  • 模块(1)
  • 线程(1)
  • 更多

Autoit(1)

Autoit

Autoit

(1)

beautifulsoup4(1)

beautifulsoup4

beautifulsoup4

(1)

debug(1)

debug

debug

.....................

对比三者可发现,contens和children输出为直接子节点的内容即

  • 标签所包含的内容,而descendant输出为子孙节点的内容不仅有

  • 所包含的内容,还直接输出了

    • 标签下
    • 标签的内容

      3.节点内容:.string属性

      二、搜索

      1. find_all(name, attrs, recursive, text,**kwargs)

      1) name 参数

      name 参数可以查找所有名字为 name 的tag,字符串对象会被⾃动忽略掉

      A.传字符串

      最简单的过滤器是字符串.在搜索⽅法中传⼊⼀个字符串参数,Beautiful Soup会查找与字符串完整匹配的内容,下⾯的例⼦⽤于查找⽂档中所有的 标签:

      soup.find_all('b')

      # [The Dormouse's story]

      B.传正则表达式

      如果传⼊正则表达式作为参数,Beautiful Soup会通过正则表达式的 match()来匹配内容.下⾯例⼦中找出所有以b开头的标签,这表示

      标签都应该被找到

      import re

      for tag in soup.find_all(re.compile("^b")):

      print(tag.name)

      # body

      # b

      C.传列表

      如果传⼊列表参数,Beautiful Soup会将与列表中任⼀元素匹配的内容返回.下⾯代码找到⽂档中所有

      soup.find_all(["a", "b"])

      # [The Dormouse's story,

      #

      ie

      ,

      # Lac

      ie,

      # Ti

      llie]

      2) keyword 参数

      soup.find_all(id_='link2')或soup.find_all(class_='link2')

      注意关键字后的下划线,没有下划线会报错

      # [Lac

      ie]

      3) text 参数

      通过 text 参数可以搜搜⽂档中的字符串内容, 与 name 参数的可选值⼀样,text 参数接受 字符串 , 正则表达式 , 列表

      soup.find_all(text="Elsie")

      # [u'Elsie']

      2.soup.find(name, attrs, recursive, text,**kwargs)

      找到第一个符合的对象

      三、css选择器

      与soup.find_all()类似,查找所有符合的节点并返回list

      (1)通过标签查找 soup.select(‘b’)

      返回所有标签为的节点

      (2)通过类名或ID查找

      Soup.select(‘.classname’)

      Soup.select(‘#id’)

      (3)组合查找

      标签+类Soup.select(‘b .classname’)

      返回b标签中类名为classname的节点

      子标签查找Soup.select(‘head>title’)

      返回父标签为head的title节点

      (4)属性查找

      Soup.select(“a[class=’link’]”)

      标签为a且class为link的节点

      Soup.select(“p a[class=’link’]”)

      返回p标签中a[class=’link’]的节点

      (5)获取内容

      get_text()

      四、爬网页图片

      1、目标网站

      1) 打开一个风景图的网站:https://www.enterdesk.com/

      2) 用 firebug 定位

      3)从下图可以看出,所有的图片都是 img 标签,父节点class属性为egeli_pic_dl

      2、用 find_all 找出所有的标签

      1).find_all(class_="legeli_pic_dl")获取所有的图片对象标签

      2).从标签里面提出 jpg 的 url 地址和 title

      1 from bs4 importBeautifulSoup2 importrequests3 importos4 r = requests.get("https://www.enterdesk.com/")5 #获取页面内容

      6 content =r.content7 #用html.parser解析html

      8 soup = BeautifulSoup(content, 'html.parser')9 #获取所有class为egene_pic_dl,返回tag类,为list

      10 all = soup.find_all(class_='egeli_pic_dl')11 for i inall:12 #获取图片路径和名称

      13 img_url = i.img['src']14 img_name = i.img['title']

      3.保存图片

      1).在当前脚本文件夹下创建一个 img 的子文件夹

      2).导入 os 模块,os.getcwd()这个方法可以获取当前脚本的路径

      3).用 open 打开写入本地电脑的文件路径,命名为:os.getcwd()+"\\img\\"+img_name+'.jpg'(命名重复的话,会被覆盖掉)

      4).requests 里 get 打开图片的 url 地址,content 方法返回的是二进制流文件,可以直接写到本地

      1 for i inall:2 #获取图片路径和名称

      3 img_url = i.img['src']4 img_name = i.img['title']5 #保存图片

      6 with open(os.getcwd()+'\\img\\'+img_name+'.jpg', 'wb') as f:7 f.write(requests.get(img_url).content)

      4.运行结果

python beautifulsoup4_【python+beautifulsoup4】Beautifulsoup4相关推荐

  1. 1-2 用Python编写【房价预测】模型----paddle

    课程>我的课程>百度架构师手把手教深度学习>1-2 用Python编写[房价预测]模型> 1-2 用Python编写[房价预测]模型 paddle初级教程第一章 第二节 王然( ...

  2. Python开发【第一篇】:目录

    本系列博文改编自武沛齐老师的原创博文,主要包含  Python基础.前端开发.Web框架.缓存以及队列等内容 ,用于学习记录成长!!! Python开发[第一篇]:目录 Python开发[第二篇]:初 ...

  3. Python开发【第二篇】:初识Python

    Python开发[第二篇]:初识Python Python简介 Python前世今生 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为 ...

  4. 基于python的论文分析_【论文实现】一篇Sigkdd的弹幕分析论文的python实现【LDA 实践者】...

    [论文实现]一篇Sigkdd的弹幕分析论文的python实现 [LDA 实践者] Author : Jasper Yang School : Bupt warning : 此篇文章基于较为熟悉Gibb ...

  5. python数据类型【浮点型(float)】

    python数据类型[浮点型(float)] 浮点型,一般在开发中用于表示小数 v1=1.34 浮点数其他知识点: 在浮点型转换为整型时,会将小数部分去掉 v1=3.14 int(v1) 3 保存小数 ...

  6. Python+Request【第二章】处理数据源信息

    Python+Request[第二章]处理数据源信息 config文件 配置config 示例代码 代码图示 读取config 示例代码 代码图示 封装config_utils 示例代码 excel文 ...

  7. 【论文实现】一篇Sigkdd的弹幕分析论文的python实现【LDA 实践者】

    [论文实现]一篇Sigkdd的弹幕分析论文的python实现 [LDA 实践者] Author : Jasper Yang School : Bupt warning : 此篇文章基于较为熟悉Gibb ...

  8. 想学python编程-【经验分享】新手如何快速学好Python?

    原标题:[经验分享]新手如何快速学好Python? 什么样的人适合学习编程?到底Python作为编程入门语言合适吗?学习Python编程,我们应该如何学?大概的学习内容包括哪些? 今天我们就用一篇文章 ...

  9. 人脸识别python face_recognize_【python+face_recognition】人脸识别初始

    [python+face_recognition]人脸识别初始 发布时间:2018-09-01 12:03, 浏览次数:366 , 标签: python face recognition face_r ...

最新文章

  1. catboost是什么?相对于xgboost以及lightgbm有什么优势?如何使用randomSearchCV和Catboost进行组合获取最优参数组合?
  2. linux 配置计算机和用户免密在本地计算机执行远程命令 hosts.equiv $HOME/.rhosts 简介
  3. PyTorch基于Apex的混合精度加速
  4. swift golang java,解决两数之和 (Javascript, Java, C#, Swift, Kotlin, Python,C++, Golang)
  5. 宝塔:ShopXO开源商城(如何二级域名访问)- 配置篇
  6. ZOJ-2342 Roads 二分图最小权值覆盖
  7. codeblocks 编译java_在CodeBlocks中发布编译程序
  8. Python机器学习:逻辑回归算法以及多类分类
  9. SQL Server 2012 T-SQL 新特性
  10. python in visual studio
  11. Linux kernel路由机制分析(上)
  12. [2018.03.13 T1] 比赛(contest)
  13. 软件开发需要学习哪些技术?
  14. 肯辛通VeriMark指纹识别器 驱动下载 与 安装指南(含视频教程) 型号:K67977 K64704 K62330
  15. 蚂蚁金服红蓝军技术攻防演练究竟有多“狠”
  16. [C#] NAudio 各种常见使用方式 播放 录制 转码 音频可视化
  17. 成都拓嘉启远:拼多多开店怎样节约物流成本
  18. 基于MDK-KILE5.23版本的STM32创建工程
  19. 服务器连接异常系统无法登录,Win10系统电脑无法登录LOL提示服务器连接异常的原因及解决方法...
  20. P4188 [USACO18JAN]Lifeguards S

热门文章

  1. 26、Windows API Shell编程(2)
  2. C#实现重新启动计算机
  3. 实战:从Mysql数据库frm文件中,提取表结构创建SQL语句
  4. Windows下的脚本在Linux中运行乱码问题
  5. 如何做出好的文档 (要学习前人的经验,不要闭门造车)
  6. 执行存储过程SQL Server阻止了对组件xp_cmdshell过程的解决方案
  7. metrics-server 安装问题解决
  8. PHP微信公众号支付弹出“NaN:undefined”解决方法
  9. 解决Ubuntu “E: 软件包 vim 还没有可供安装的候选者“问题
  10. linux环境手动编译安装Nginx实践过程 附异常解决