上一节说到tag, 这里接着讲, tag有个属性叫做string, tag.string其实就是我们要掌握的四个对象中的第二个 ---- NavigableString,  它代表的是该tag内的text(甚至包括空白字符, 该tag内如果有别的tag, 必须前后紧挨不带空格, 否则返回None, 这一点的原因在下面提到了.), 其实这个NavigableString就是对于普通的Unicode的字符串的封装, 除了他提供一些对方便html结构树进行搜索的方法, 同时我们可以用.replace_with()来替换tag的内容, 我们可以用 unicode() 来将它转化为普通string.

 tag.string
# u'Extremely bold'
type(tag.string)
# <class 'bs4.element.NavigableString'> unicode_string = unicode(tag.string)
unicode_string
# u'Extremely bold'
type(unicode_string)
# <type 'unicode'> tag.string.replace_with("No longer bold")
tag
# <blockquote>No longer bold</blockquote>

最后一个要说的对象叫做Comment, Comment 其实就是特殊的NavigableString对象. 经过实现发现只有紧挨这父tag写, 才有效果, 否则会返回None.(原因也在下面提到了)

 markup = "<b><!--Hey, buddy. Want to buy a used parser?--></b>"
#<b> <!--前面有一个空格--></b> --> 这样会直接返回None
soup = BeautifulSoup(markup)
comment = soup.b.string
type(comment)
# <class 'bs4.element.Comment'>

了解了这四类对象, 接下来我们就可以探究如何找到所需要的内容...

下面是最简单的方式 :

soup.head
# <head><title>The Dormouse's story</title></head> 如果有多个返回第一个 soup.body.b
# <b>The Dormouse's story</b> 先找到第一个body, 再找body中的第一个b soup.b
#如果上例中b是最先出现的, 那么也可以直接索引得到.

.contents 和 .children:

这两者的区别在于.contents返回的是列表, .children返回的是generator(但是其实内容都是一样的)...

比如对于

 <body>
<b>
aabbccdd
</b>
</body>
 soup = BeautifulSoup(open('test.html'), 'lxml')
print(soup.body.contents)

结果是:

['\n', <b>
  aabbccdd
</b>, '\n']

值得一提的是BeautifulSoup也有自己的contents.

.descendants :

这个和.children唯一的区别在于前者返回所有子孙后者只返回直系孩子, 就不多说了.

.string :

如果一个tag只有一个children并且那个children还是NavigableString(这种情况就是tag的内容是纯文字), 那么我们可以用.string来获得它.

 <b>
aabbccdd
</b>

上述html的b.contents是这样的 :

['\n    aabbccdd\n']

对于这种, 就是符合上面所说的情况的, 就可以用b.string来获得它...

同时如果一个tag只有一个children并且它的children是另外一个tag, 且另外一个tag有一个.string, 那么这个tag的.string就等于它的孩子的.string.

对于这个例子是不行的 :

 <body>
<b>
aabbccdd
</b>
</body>

对这个例子来说, 调用.contents的结果是这样的:

['\n', <b>
aabbccdd
</b>, '\n']

除非把上面的例子写成这样 :

<body><b> aabbccdd </b></body>

这就是为什么我上面说要想得到.string必须tag前后紧挨不能有空格的原因.

读BeautifulSoup官方文档之与bs有关的对象和属性(2)的更多相关文章

  1. 读BeautifulSoup官方文档之与bs有关的对象和属性(1)

    自从10号又是5天没更, 是, 我再一次断更... 原因是朋友在搞python, 老问我问题, 我python也是很久没碰了, 于是为了解决他的问题, 我只能重新开始研究python, 为了快速找回感 ...

  2. 读BeautifulSoup官方文档之与bs有关的对象和属性(3)

    上一节说到.string的条件很苛刻, 如果某个tag里面包含了超过一个children, 就会返回None, 但是这里提供另外一种方式 .strings, 它返回的是一个generator, 比如对 ...

  3. 读BeautifulSoup官方文档之html树的打印

    prettify()能返回一个格式良好的html的Unicode字符串 : markup = '<a href="http://example.com/">I link ...

  4. 读BeautifulSoup官方文档之html树的搜索(1)

    之前介绍了有关的四个对象以及他们的属性, 但是一般情况下要在杂乱的html中提取我们所需的tag(tag中包含的信息)是比较复杂的, 现在我们可以来看看到底有些什么搜索的方法. 最主要的两个方法当然是 ...

  5. 读BeautifulSoup官方文档之html树的修改

    修改html树无非是对其中标签的改动, 改动标签的名字(也就是类型), 属性和标签里的内容... 先讲这边提供了很方便的方法来对其进行改动... soup = BeautifulSoup('<b ...

  6. 读BeautifulSoup官方文档之html树的搜索(2)

    除了find()和find_all(), 这里还提供了许多类似的方法我就细讲了, 参数和用法都差不多, 最后四个是next, previous是以.next/previous_element()来说的 ...

  7. 读vue-cli3 官方文档的一些学习记录

    原来一直以为vue@cli3 就是创建模板的工具,读了官方文档才知道原来这么有用,不少配置让我长见识了 Prefetch 懒加载配置 懒加载相信大家都是知道的,使用Import() 语法就可以在需要的 ...

  8. Beautifulsoup官方文档

    Beautiful Soup 中文文档 原文 by Leonard Richardson (leonardr@segfault.org) 翻译 by Richie Yan (richieyan@gma ...

  9. 读jQuery官方文档:$(document).ready()与避免冲突

    $(document).ready() 通常你想在DOM结构加载完毕之后才执行相关脚本.使用原生JavaScript,你可能调用window.onload = function() { ... }, ...

随机推荐

  1. php实现求扑克牌顺子(*****)(AC)(分类:把问题分小,利于排错)

    php实现求扑克牌顺子(*****)(AC)(分类:把问题分小,利于排错) 一.总结 分类(那就可以把问题分小而逐步完成每个板块,这样是很简单的) 分类还有助于查错 二.php实现求扑克牌顺子 题目描 ...

  2. hdu 4644 BWT (kmp)

    看完题目你非常easy想到,这个题目的关键点就是怎样把给出的数组还原成原数组. 还原的原数组之后无论是AC自己主动机 还是 kmp都能够解决 - -尽管我认为kmp会超时的感觉. 那么怎样还原这个字符 ...

  3. js中 慎用for(var o in arrays) 遍历数组,for(var i,i< objects.length;i++)与for(var i,n = objects.length;i<n;i++) 的性能区别

    原文:js中 慎用for(var o in arrays) 遍历数组,for(var i,i< objects.length;i++)与for(var i,n = objects.length; ...

  4. IT咨询服务-客户案例(四):根据图片等素材,动态生成个性化图片

    最近,慕名而来一个客户. 客户的目标    网站来一个用户,选择模版,上传图片等素材,生成自定义的图片,或者静态网站,然后分享到社交网站.有点类似于,网上制作名片,选择模版,输入个人信息,生成名片的设 ...

  5. 虚拟机的ip网络设置的选择

    首先看一下vm的这几个设置 通过截图可以基本看到几个网络设置的区别,具体体现在虚拟机装好以后,网络设置会多出两个适配器,不同模式会分配不同区段的ip,需要固定时主要区段要求 所以总结一下 1.桥连,适 ...

  6. springMVC出现HTTP Status 405 - Request method 'GET' not supported错误的解决方法

    今天在写一个简单的springMVC的表单请求处理时,出现了这个问题.我的form表单用的是post方法提交,并没有使用get方法,出现这个问题时,笔者可谓是一脸懵逼. 这是form表单: 这是对po ...

  7. Android Studio打包apk,aar,jar包

    转载请标明出处:一片枫叶的专栏 文本我们将讲解android studio打包apk,aar,jar包的相关知识.apk包就是android系统的安装包,这里没什么好说的,aar包是android中独 ...

  8. Live Unit Testing

    Live Unit Testing 相对于传统的Unit Test,VS2017 带来了一个新的功能,叫Live Unit Testing,从字面意思理解就是实时单元测试,在实际的使用中,这个功能就是 ...

  9. Vue中import '@...'是什么

    今天看新项目代码,有import '@/assets/css/theme/index.css'一类的代码,里面的@是做什么的呢.   找到这篇文章https://www.cnblogs.com/bos ...

  10. Android菜鸟的成长笔记(20)——IntentService

    前面介绍的Service在官方文档介绍中说Service存在着如下两个问题: 1.A Service is not a separate process. The Service object its ...