
上面的 title a 等等 HTML 标签加上里面包含的内容就是 Tag,下面我们来体验一下怎样用 Beautiful Soup 来便于地获取 Tags
下面每一段代码中注解部分即为运行结果
#<title>The Dormouse's story</title>
#<head><title>The Dormouse's story</title></head>
#<a href="http://example.com/elsie"><!-- Elsie --></a>
#<p><b>The Dormouse's story</b></p>
我们可以借助 soup加标签名轻松地获得很多标签的内容,是不是感觉比正则表达式方便多了?不过有一点是,它查找的是在所有内容中的第一个符合规定的标签,如果要查询所有的标签,我们在前面进行介绍。
我们可以验证一下这些对象的类型
对于 Tag,它有两个重要的属性beautifulsoup 存文件,是 name 和 attrs,下面我们分别来体验一下
name
soup 对象原本非常特殊,它的 name 即为 [document],对于其它外部标签,输出的值便为标签本身的名称。
attrs
#{'class': ['title'], 'name': 'dromouse'}
在这里,我们把 p 标签的所有属性打印输出了起来,得到的类型是一个字典。
如果我们想要单独获得某个属性,可以这么,例如我们获得它的 class 叫什么
还可以这么,利用get方式,传入属性的名称,二者是等价的
我们可以对这种属性和内容等等进行设置,例如
#<p><b>The Dormouse's story</b></p>
还可以对这个属性进行删除,例如
#<p><b>The Dormouse's story</b></p>
不过,对于设置删除的操作,不是我们的主要功能,在此不做详细介绍了,如果有必须,请查看里面提供的官网文档
既然我们终于受到了标签的内容,那么疑问来了,我们要想获取标签外部的文字如何办呢?很简单,用 .string 即可,例如

这样我们就轻松获得到了标签上面的内容,想想既然用正则表达式要多麻烦。它的类型是一个NavigableString,翻译过来叫 可以递归的字符串,不过我们最好还是称它英文名字吧。
来检查一下它的类型
BeautifulSoup 对象表示的是一个文档的全部内容.大部分时候,可以把它当成 Tag 对象,是一个特殊的 Tag,我们可以分别获得它的类别,名称,以及属性来体验一下
#<type 'unicode'>
# [document]
#{} 空字典
Comment 对象是一个特殊类型的 NavigableString 对象,其实输出的内容依然不包含注释符号,但是一旦不好好处理它beautifulsoup 存文件,可能会对我们的文本处理产生意想不到的麻烦。
我们找一个带注释的标签
运行结果如下
a 标签里的内容实际上是注解,但是一旦我们运用 .string 来输出它的内容,我们看到它早已把注解符号去掉了,所以这可能会给我们带给不必要的麻烦。
另外我们打印输出下它的类型,发现它是一个 Comment 类型,所以,我们在使用前最好做一下判断,判断代码如下
上面的代码中,我们首先判定了它的类别,是否为 Comment 类型,然后再进行其它操作,如打印输出。
要点:.contents .children 属性
.contents
tag 的 .content属性可以将tag的子节点以列表的方法输出
#[<title>The Dormouse's story</title>]
输出模式为列表,我们可以用列表索引来获得它的某一个元素
#<title>The Dormouse's story</title>
.children
它返回的不是一个 list,不过我们可以借助遍历获得所有子节点。
我们打印输出 .children 看一下,可以看到它是一个 list 对象
#<listiterator object at 0x7f71457f5710>

我们如何获取上面的内容呢?很简单,遍历一下就好了,代码及结果如下
知识点:.descendants 属性
.descendants
.contents 和 .children 属性仅包括tag的直接子节点,.descendants 属性可以对所有tag的子孙结点进行遍历循环,和 children类似,我们也应该枚举获取其中的内容。
运行结果如下,可以看到,所有的节点都被打印下来了,先生最外层的 HTML标签,其次从 head 标签一个个剥离,以此类推。
<html><head><title>The Dormouse's story</title></head>
<body>
知识点:.string 属性
如果tag只有一个 NavigableString 类型子节点,那么这个tag可以使用 .string 得到子节点。如果一个tag仅有一个子节点,那么这个tag也可以使用 .string 方法,输出结果与当前唯一子节点的 .string 结果同样。
通俗点说就是:如果一个标签上面没有标签了,那么 .string 就会返回标签上面的内容。如果标签上面只有唯一的一个标签了,那么 .string 也会返回最上面的内容。例如
如果tag包含了多个子节点,tag就能够确认,string方法需要读取那个子节点的内容, .string的输出结果是 None
知识点: .strings .stripped_strings 属性
.strings
获取多个内容,不过应该枚举获取,比如上面的举例
.stripped_strings
输出的字符串中也许包括了这些空格或空行,使用 .stripped_strings 可以去掉多余空白内容
# u"The Dormouse's story"
# u"The Dormouse's story"
# u'Once upon a time there were three little sisters; and their names were'
# u';\nand they lived at the bottom of a well.'
知识点: .parent 属性
知识点:.parents 属性

通过元素的 .parents 属性可以递归得到元素的所有父辈节点,例如
知识点:.next_sibling .previous_sibling 属性
兄弟节点可以理解为和本节点处在统一级的节点,.next_sibling 属性获得了该节点的下一个兄弟节点,.previous_sibling 则与之相反,如果节点不存在,则返回 None
注意:实际文档中的tag的 .next_sibling 和 .previous_sibling 属性一般是字符串或空白,因为空白以及换行也可以被视作一个节点,所以受到的结果也许是空白以及换行
# 实际该处为空白
#None 没有前一个兄弟节点,返回 None
#<p>Once upon a time there were three little sisters; and their names were
#<a href="http://example.com/elsie"><!-- Elsie --></a>,
#<a href="http://example.com/lacie">Lacie</a> and
#<a href="http://example.com/tillie">Tillie</a>;
#and they lived at the bottom of a well.</p>
#下一个节点的下一个兄弟节点是我们可以发现的节点
知识点:.next_siblings .previous_siblings 属性
通过 .next_siblings 和 .previous_siblings 属性可以对当前节点的兄弟节点迭代输出
# <a href="http://example.com/lacie">Lacie</a>
# <a href="http://example.com/tillie">Tillie</a>
# u'; and they lived at the bottom of a well.'
知识点:.next_element .previous_element 属性
与.next_sibling .previous_sibling 不同,它并不是针针对兄弟节点,而是在所有节点,不分层次
比如 head 节点为
那么它的下一个节点便是 title,它是不分层次关系的
#<title>The Dormouse's story</title>

知识点:.next_elements .previous_elements 属性
通过 .next_elements 和 .previous_elements 的迭代器就可以往前或向后访问文档的解读内容,就似乎文档正在被解析一样
# u'Tillie'
# u';\nand they lived at the bottom of a well.'
# <p>...</p>
以上是数组文档树的基本用法。
find_all() 方法搜索当前tag的所有tag子节点,并判定是否依照过滤器的条件
1)name 参数
name 参数可以查找所有名字为 name 的tag,字符串对象会被手动忽略掉
A.传字符串
最简单的过滤器是字符串.在搜索方式中传入一个字符串参数,Beautiful Soup会查找与字符串完整匹配的内容,下面的事例用于查找文档中所有的<b>标签
# [<b>The Dormouse's story</b>]
#[<a href="http://example.com/elsie"><!-- Elsie --></a>, <a href="http://example.com/lacie">Lacie</a>, <a href="http://example.com/tillie">Tillie</a>]
B.传正则表达式
如果传入正则表达式作为参数,Beautiful Soup会通过正则表达式的 match() 来匹配内容.下面举例中找出所有以b结尾的标签,这表示<body>和<b>标签都需要被找到
C.传列表
如果传入列表参数,Beautiful Soup会将与列表中任一元素匹配的内容返回.下面代码找到文档中所有<a>标签和<b>标签
# [<b>The Dormouse's story</b>,
#<a href="http://example.com/elsie">Elsie</a>,
#<a href="http://example.com/lacie">Lacie</a>,
#<a href="http://example.com/tillie">Tillie</a>]
D.传 True
True 可以匹配任何值,下面代码查找到所有的tag,但是不会返回字符串节点
E.传方法
如果没有合适过滤器,那么还可以定义一个方法,方法只接受一个元素参数 ,如果这个办法返回 True 表示当前元素匹配甚至被找到,如果不是则反回 False
下面步骤校验了当前元素,如果包括 class 属性却不包含 id 属性,那么将返回 True:
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-122406-1.html
你只是站在自己的位置上去看问题
黑芝麻糊
杨洋很机智