zoukankan      html  css  js  c++  java
  • Beautiful Soup 4.2.0 doc_tag、Name、Attributes、多值属性

    找到了bs4的中文文档,对昨天爬虫程序里所涉及的bs4库进行学习。这篇代码涉及到tag、Name、Attributes以及多值属性。

      1 '''
      2 对象的种类
      3 Beautiful Soup将复杂HTML文档转换成一个复杂的树形结构,每个节点都是Python对象。
      4 所有对象可以归纳为4种: Tag , NavigableString , BeautifulSoup , Comment 。
      5 '''
      6 
      7 from bs4 import BeautifulSoup
      8 
      9 soup = BeautifulSoup('<b class="boldest">Extremely bold</b>','lxml')
     10 tag = soup.b
     11 type(tag)
     12 #<class 'bs4.element.Tag'>
     13 
     14 
     15 #TAG.NAME
     16 tag
     17 #<b class="boldest">Extremely bold</b>
     18 tag.name
     19 #'b'
     20 tag.name = 'blockquote'
     21 tag
     22 #<blockquote class="boldest">Extremely bold</blockquote>
     23 '''
     24     即tag首的'<'后和tag尾'</>'内,就是这个tag的名称.
     25     如果改变了tag的name,那将影响所有通过当前Beautiful Soup对象生成的HTML文档
     26 '''
     27 tag.name = 'b'
     28 
     29 
     30 #Attributes
     31 '''一个tag可以有多个属性。如tag <b class="boldest">,他有一个"class"属性,值为"boldest"。'''
     32 #tag属性的操作方法与字典相同。
     33 tag['class']
     34 # u'boldest'
     35 tag.attrs     #“点”取属性
     36 # {u'class':u'boldest'}
     37 '''
     38 tag的属性可以被添加、删除或修改。tag的属性操作方法与字典一样。
     39 '''
     40 tag['class'] = 'verybold'    #属性查看
     41 tag['id'] = 1                #属性查看
     42 tag
     43 # <blockquote class="verybold" id="1">Extremely bold</blockquote>
     44 
     45 del tag['class']             #属性删除
     46 del tag['id']                #属性删除
     47 tag
     48 # <blockquote>Extremely bold</blockquote>
     49 
     50 tag['class']                 #删除属性后查看,报错
     51 # KeyError: 'class'
     52 print(tag.get('class'))
     53 # None
     54 
     55 
     56 #多值属性
     57 '''
     58 最常见的多值属性是class,还有一些多值属性如 rel, rev, accept-charset, headers,accesskey等。
     59 多值属性在 BeautifulSoup 中的返回类型是list:
     60 '''
     61 css_soup = BeautifulSoup('<p class="body strikeout"></p>')  #这里虽然body和strikeout只用了一个空格隔开,但其仍然会被隔开返回。(大概因为在HTML的语法里这就代表了两个属性)
     62 css_soup.p['class']
     63 # ["body", "skrikeout"]
     64 
     65 css_soup = BeautifulSoup('<p class="body"></p>')
     66 css_soup.p['class']
     67 # ["body"]             #这里虽然class的属性只有一个值,但是因为class本身是一个多值属性,故返回了list
     68 '''
     69 (接上一行注释)而如果某个属性看上去有多个值,但在任何版本的HTML定义中都没有被定义为多值属性,
     70 那么BeautifulSoup会将这个属性作为字符串返回。如下↓
     71 '''
     72 id_soup = Beautiful('<p id="my id"></p>')
     73 id_soup.p['id']
     74 # 'my id'
     75 '''
     76 将tag转换为字符串时,多值属性会合并为一个值
     77 '''
     78 rel_soup = BeautifulSoup('<p>Back to the <a rel="index">homepage</a></p>')
     79 rel_soup.a['rel']
     80 # ['index']
     81 rel_soup.a['rel'] = ['index','contents']#给a标签的rel属性添加值,转化在html里就是空格连接
     82 print(rel_soup.p)
     83 # <p>Back to the <a rel="index contents">homepage</a></p>
     84 '''
     85 如果转换的文档是XML格式,那么tag中不包含多值属性
     86 '''
     87 xml_soup = BrautifulSoup('<p class="body strikeout"></p>','xml')#lxml有多值属性,xml没有
     88 xml_soup.p['class']             #xml里的class属性值输出出来仍然是(如非多值属性的)字符串形式,而非列表
     89 # u'body strikeout'
     90 
     91 
     92 #可以遍历的字符串
     93 '''
     94 字符串常被包含在tag内,BeautifulSoup用 NavigableString 类来包装tag中的字符串:
     95 '''
     96 tag.string
     97 # u'Extremely bold'
     98 type(tag.string)
     99 # <class 'bs4.element.NavigableString'>
    100 '''
    101 一个 NavigableString 字符串与Python中的Unicode字符串相同,
    102 并且还支持包含在遍历文档树和搜索文档树中的一些特性,
    103 通过unicode()方法可以直接将 NavigableString 对象转换成 Unicode 字符串:
    104 '''
    105 unicode_string = unicode(tag.string)
    106 unicode_string
    107 # u'Extremely bold'
    108 type(unicode_string)
    109 # <type 'unicode'>
    110 '''
    111 tag中包含的字符串不能编辑,但是可以被替换成其它的字符串,用replace_with()方法:
    112 '''
  • 相关阅读:
    OVS local network 连通性分析
    再部署一个 instance 和 Local Network
    ARM Linux系统调用的原理
    Linux内存管理中的slab分配器
    浅析基于ARM的Linux下的系统调用的实现
    分享一个查看十六进制的位的小程序
    mokoid 源代码下载
    shell中eval的使用问题
    批量去掉文件中的^M
    基于TINY4412的Andorid开发-------简单的LED灯控制
  • 原文地址:https://www.cnblogs.com/hsh17/p/10908106.html
Copyright © 2011-2022 走看看