马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 MSK 于 2017-7-10 11:23 编辑
节点
这一帖的内容可能有点多,请大家耐心
推荐阅读:BeautifulSoup对象
-----------------------------------------------------------------------------------------------------------------------------------------------------------
子节点
在html文档中一个Tag可能包含多个字符串或其它的Tag,这些都是这个Tag的子节点
<title>就是<head>的子节点,反过来<head>就是<title>的父节点
注意: Beautiful Soup中字符串节点不支持这些属性,因为字符串没有子节点
- <head><title>标题</title></head>
复制代码
Beautiful Soup提供了许多操作和遍历子节点的属性.
最简单的方法就是告诉它你想获取的tag的name.如果想获取 <head> 标签,只要用 soup.head :
- soup.head
- # <head><title>The Dormouse's story</title></head>
复制代码
获取<title>标签
- soup.title
- # <title>The Dormouse's story</title>
复制代码
你也可以多次调用这个方法
- soup.head.title
- # <title>The Dormouse's story</title>
复制代码
但是!!!
通过点取属性的方式只能获得当前名字的第一个tag!
通过点取属性的方式只能获得当前名字的第一个tag!
通过点取属性的方式只能获得当前名字的第一个tag!
[u] find_all [/u]
如果想要得到所有的标签,比如<a>标签,就需要用到一些方法,比如: find_all()
- soup.find_all('a')
- # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,
- # <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,
- # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]
复制代码
返回的是一个列表
查看子节点
.contents 和 .children
tag的 .contents 属性可以将tag的子节点以列表的方式输出:
- head_tag = soup.head
- head_tag
- # <head><title>The Dormouse's story</title></head>
- head_tag.contents
- [<title>The Dormouse's story</title>]
- title_tag = head_tag.contents[0]
- title_tag
- # <title>The Dormouse's story</title>
- title_tag.contents
- # [u'The Dormouse's story']
复制代码
BeautifulSoup 对象本身一定会包含子节点,也就是说<html>标签也是 BeautifulSoup 对象的子节点:
字符串没有 .contents 属性,因为字符串没有子节点:
- text = title_tag.contents[0]
- text.contents
- # AttributeError: 'NavigableString' object has no attribute 'contents'
复制代码
通过tag的 .children 生成器,可以对tag的子节点进行循环:
- for child in title_tag.children:
- print(child)
- # The Dormouse's story
- .descendants
复制代码
-----------------------------------------------------------------------------------------------------------------------------------------------------------
子孙节点
上!代!码! :
- head_tag.contents
- # [<title>The Dormouse's story</title>]
复制代码
.contents 和 .children 属性仅包含tag的直接子节点.例如,<head>标签只有一个直接子节点<title>
但是<title>标签也包含一个子节点:字符串 “The Dormouse’s story”,这种情况下字符串 “The Dormouse’s story”也属于<head>标签的子孙节点.
.descendants
.descendants 属性可以对所有tag的子孙节点进行递归循环 :
- for child in head_tag.descendants:
- print(child)
- # <title>The Dormouse's story</title>
- # The Dormouse's story
复制代码
-----------------------------------------------------------------------------------------------------------------------------------------------------------
父节点
.parent
通过 .parent 属性来获取某个元素的父节点.在例子“爱丽丝”的文档中,<head>标签是<title>标签的父节点:
- title_tag = soup.title
- title_tag
- # <title>The Dormouse's story</title>
- title_tag.parent
- # <head><title>The Dormouse's story</title></head>
复制代码
文档title的[/b]字符串也有父节点:<title>标签
- title_tag.string.parent
- # <title>The Dormouse's story</title>
复制代码
文档的顶层节点比如<html>的父节点是 :BeautifulSoup 对象:
- html_tag = soup.html
- type(html_tag.parent)
- # <class 'bs4.BeautifulSoup'>
复制代码
当然BeautifulSoup 对象没有父节点,所以它的 .parent 是None:
- print(soup.parent)
- # None
复制代码
-----------------------------------------------------------------------------------------------------------------------------------------------------------
兄弟节点
同一个元素的子节点,被称为兄弟节点
for example:
- sibling_soup = BeautifulSoup("<a><b>text1</b><c>text2</c></b></a>")
- print(sibling_soup.prettify())
- # <html>
- # <body>
- # <a>
- # <b>
- # text1
- # </b>
- # <c>
- # text2
- # </c>
- # </a>
- # </body>
- # </html>
复制代码
因为<b>标签和<c>标签是同一层,都是<a>的子节点,所以<b>和<c>可以被称为兄弟节点。
.next_sibling 和 .previous_sibling
使用 .next_sibling 和 .previous_sibling 属性来查询兄弟节点:
- sibling_soup.b.next_sibling
- # <c>text2</c>
- sibling_soup.c.previous_sibling
- [size=4]不过。。。。
- [hide]实际文档中的tag的 .next_sibling 和 .previous_sibling 属性通常是字符串或空白.
- {:10_258:} [/size]
- [size=4]
- 看看这一段html文档:[/size]
- [code]<a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>
- <a href="http://example.com/lacie" class="sister" id="link2">Lacie</a>
- <a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>
复制代码
如果以为第一个<a>标签的 .next_sibling 结果是第二个<a>标签,那就错了!
真实结果是第一个<a>标签和第二个<a>标签之间的顿号和换行符:
- link = soup.a
- link
- # <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>
- link.next_sibling
- # u',\n'
复制代码
|