BeautifulSoup官方介绍文档:https://www.crummy.com/software/BeautifulSoup/bs4/doc/index.zh.html

四大对象种类:

BeautifulSoup 将复杂的html文件转换成一个复杂的树形结松,每个节点都是python对象。

所有对象可以分下以下四类:

Tag

NavigableString

BeautifulSoup

Comment

下面进行一一介绍:

1、Tag  

通俗点讲就是html中的一个个标签,例如:

<title>Hello world </title>

<a class ="test",href="http://www.baidu.com" id="link1"> Elsie </a>

上面的 title a 等等 HTML 标签加上里面包括的内容就是 Tag,下面我们来感受一下怎样用 Beautiful Soup 来方便地获取 Tags

下面每一段代码中注释部分为运行结果:

print soup.title

#<title>Hello world </title>

print soup.head

#<head><title>The Dormouse's story</title></head>

print soup.a

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

print soup.p

#<p class="title" name="dromouse"><b>The Dormouse's story</b></p>

  我们可以利用 soup加标签名轻松地获取这些标签的内容,是不是感觉比正则表达式方便多了?

  我们可以验证一下这些对象的类型:

  print type(soup.a)

  #<class 'bs4.element.Tag'>

  

对于tag,它有两个重要的属性,是nameattrs

  name:

  print soup.name

  print soup.head.name

  #[document]

  #head
  soup 对象本身比较特殊,它的 name 即为 [document],对于其他内部标签,输出的值便为标签本身的名称。
 
  attrs
  print soup.p.attrs
  #{'class': ['title'], 'name': 'dromouse'}    //得到类型是一个字典
 
  如果我们想要单独获取某个属性,可以这样:
  print soup.p['class']
     #['title']
 
  还可以这样,得用get方法,传入属性的名称,二者是等价的:
     print soup.p.get('class')
      #['title']
 

  

2、NaviableString

既然我们已经得到了标签的内容,那么问题来了,我们要想获取标签内部的文字怎么办呢?很简单,用 .string 即可

print soup.p.string

#The Dormouse's story

  检查一下它的类型

print type(soup.p.string)

  #<class 'bs4.element.NavigableString'>

3、BeautifulSoup

  对象表示的是一个文档的全部内容.大部分时候,可以把它当作 Tag 对象,是一个特殊的 Tag,我们可以分别获取它的类型,名称,以及属性来感受一下

  print type(soup.name)

  #<type 'unicode'>

  print soup.name

  #[document]

  print soup.attrs

  #{} 空字典

4、Comment

  对象是一个特殊类型的 NavigableString 对象,其实输出的内容仍然不包括注释符号,但是如果不好好处理它,可能会对我们的文本处理造成意想不到的麻烦。

  我们找一个带注释的标签

  print soup.a

  print soup.a.string

  print type(soup.a.string)

  结果如下:

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

  Elsie

  <class 'bs4.element.Comment'>

  

  a 标签里的内容实际上是注释,但是如果我们利用 .string 来输出它的内容,我们发现它已经把注释符号去掉了,所以这可能会给我们带来不必要的麻烦。

  另外我们打印输出下它的类型,发现它是一个 Comment 类型,所以,我们在使用前最好做一下判断,判断代码如下:

  if type(soup.a.string)=="bs4.element.Comment":

    print soup.a.string

  上面的代码中,我们首先判断了它的类型,是否为 Comment 类型,然后再进行其他操作,如打印输出。

  

实例应用:

import requests

from bs4 import BeautifulSoup

url = "http://www.baidu.com"

html_doc = requests.get(url).content

soup = BeautifulSoup(html_doc,'lxml')

for link in soup.find_all('a'):

  print (link.get_text())    #获取tag中的文本内容

print (link.get('href'))    #获取tag的属性,用get("attr")

  

爬虫库之BeautifulSoup学习(二)的更多相关文章

  1. 爬虫库之BeautifulSoup学习(一)

    Beautiful Soup的简介 简单来说,Beautiful Soup是python的一个库,最主要的功能是从网页抓取数据. 官方解释如下: Beautiful Soup提供一些简单的.pytho ...

  2. 爬虫库之BeautifulSoup学习(五)

    css选择器: 我们在写 CSS 时,标签名不加任何修饰,类名前加点,id名前加 #,在这里我们也可以利用类似的方法来筛选元素,用到的方法是 soup.select(),返回类型是 list 1)通过 ...

  3. 爬虫库之BeautifulSoup学习(四)

    探索文档树: find_all(name,attrs,recursive,text,**kwargs) 方法搜索当前tag的所有tag子节点,并判断是否符合过滤器的条件 1.name参数,可以查找所有 ...

  4. 爬虫库之BeautifulSoup学习(三)

    遍历文档树: 1.查找子节点 .contents tag的.content属性可以将tag的子节点以列表的方式输出. print soup.body.contents print type(soup. ...

  5. 【Python】在Pycharm中安装爬虫库requests , BeautifulSoup , lxml 的解决方法

    BeautifulSoup在学习Python过程中可能需要用到一些爬虫库 例如:requests BeautifulSoup和lxml库 前面的两个库,用Pychram都可以通过 File--> ...

  6. 网页3D效果库Three.js学习[二]-了解照相机

    camera 上篇大致了解了three.js ,并可以创建一个简单的可动的立方体.下来我们着重了解下camera (照相机),照相机其实就是视角,就像你的眼睛.Three.js有两种不同的相机模式:直 ...

  7. 使用Python爬虫库BeautifulSoup遍历文档树并对标签进行操作详解(新手必学)

    为大家介绍下Python爬虫库BeautifulSoup遍历文档树并对标签进行操作的详细方法与函数下面就是使用Python爬虫库BeautifulSoup对文档树进行遍历并对标签进行操作的实例,都是最 ...

  8. 爬虫概念与编程学习之如何爬取视频网站页面(用HttpClient)(二)

    先看,前一期博客,理清好思路. 爬虫概念与编程学习之如何爬取网页源代码(一) 不多说,直接上代码. 编写代码 运行 <!DOCTYPE html><html><head& ...

  9. python爬虫解析库之Beautifulsoup模块

      一 介绍 Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式.Beautiful Soup会 ...

随机推荐

  1. android页面间传递对象

    android传递对象有两种方式: 一种是Serializable和Parcelable 对于第一种方式: import java.io.Serializable; public class Shop ...

  2. PC常用电源IC、MOS、三极管、二极管厂家

    笔记本常用MOS.三极管.二极管厂家: 1.EMC 杰力电子(台湾)官方网站:http://www.excelliancemos.com/tw/solution.php 2.UBIQ(台湾电源厂家UP ...

  3. hdoj 5094 Maze 【BFS + 状态压缩】 【好多坑】

    Maze Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 100000/100000 K (Java/Others) Total Sub ...

  4. Kubernetes调度之亲和与反亲和

    系列目录 部署pod时,大多数情况下kubernetes的调度程序能将pod调度到集群中合适的节点上.但有些情况下用户需要对pod调度到哪个节点上施加更多控制,比如将特定pod部署到拥有SSD存储节点 ...

  5. 机器学习资源汇总----来自于tensorflow中文社区

    新手入门完整教程进阶指南 API中文手册精华文章TF社区 INTRODUCTION 1. 新手入门 1.1. 介绍 1.2. 下载及安装 1.3. 基本用法 2. 完整教程 2.1. 总览 2.2.  ...

  6. Nginx详细的安装教程(linux)

    转:https://blog.csdn.net/u013641234/article/details/73838472 Nginx作为一个web服务器,目前使用最多的就利用其负载均衡,本篇着重讲解的是 ...

  7. Nginx下的https配置

    https: https(Secure Hypertext Transfer Protocol) 安全超文本传输协议 它是以安全为目标的http通道,即它是http的安全版.它使用安全套接字层(SSL ...

  8. Vue中data重置问题

    Object.assign() Object.assign()方法用于将所有可枚举属性的值从一个或多个源对象复制到目标对象.它将返回目标对象. 目标对象有1个,后边可以有多个源对象.注意他只会拷贝源对 ...

  9. ajax json html 结合

    <table id="datas" border="1" cellspacing="0" style="border-col ...

  10. DuiLib笔记之CDuiString的bug

    在C/C++中,当使用==比较两个对象时,推荐的风格是将常量置前 例如 if (0 == variable) { ... } 但在DuiLib中,CDuiString存在一个bug:在用==进行比较时 ...