zoukankan      html  css  js  c++  java
  • 爬虫库之BeautifulSoup学习(二)

    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")

      

         

  • 相关阅读:
    ASP.NET获取服务器信息大全
    放在IIS上就报错
    WEB资源管理器
    用于主题检测的临时日志(925f1df8130a43969337cfd4cbeb06a4 3bfe001a32de4114a6b44005b770f6d7)
    如何正确的判断String是否为空
    直接输出另存
    查询聊天消息SQL语句!
    ShareSDKUndefined symbols for architecture arm64
    今天起航...
    UIScrollView方法 scrollRectToVisible: animated: 无效(不工作,无效果)的问题
  • 原文地址:https://www.cnblogs.com/yu2000/p/6844329.html
Copyright © 2011-2022 走看看