计算机系统应用教程网站

网站首页 > 技术文章 正文

没有一点点水分的干货,Python爬虫获取数据时节点的区别

btikc 2024-10-25 10:58:27 技术文章 6 ℃ 0 评论


在上篇文章当中,具体讲了节点所代表的Python对象,至于节点之间有什么区别,则是本篇文章所要描述的内容。


虽然这些天的内容有一点枯燥,但是这可都是纯粹的干货啊,(虽然干的有点咽不下去)。


任何新事物的学习,都离不开基础的铺垫,只有了解掌握了这些基础知识,才能在今后的实际应用中得心应手。


节点,节点又分为子节点和父节点。


子节点


一个Tag可能包含多个字符串,这些都是这个Tag的子节点.


Beautiful Soup提供了许多操作子节点的属性.


我们用 Beautiful Soup 所获取的文档是以文档树的形式出现的。

操作文档树最简单的方法就是发送一个请求,.如果想获取 <head> 标签,只要用 soup.head


soup.head

# <head><title>The Dormouse's story</title></head>


soup.title

# <title>The Dormouse's story</title>


如果想要得到所有的<a>标签,通过名字得到比一个tag更多的内容的时候,就需要用到 Searching the tree 中描述的方法,比如: 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 对象的子节点。


len(soup.contents)

# 1

soup.contents[0].name


便签本身也占据一个字符长度


字符串没有 .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


.contents 和 .children 属性仅包含tag的直接子节点.例如,<head>标签只有一个直接子节点<title>


head_tag.contents

# [<title>The s story</title>]


.string


如果tag只有一个 NavigableString 类型子节点,那么这个tag可以使用 .string 得到子节点:


title_tag.string

# u'The s story'


如果一个tag仅有一个子节点,那么这个tag也可以使用 .string 方法,输出结果与当前唯一子节点的 .string 结果相同:


head_tag.contents

# [<title>The s story</title>]


head_tag.string

# u'The s story'

如果tag包含了多个子节点,tag就无法确定 .string 方法应该调用哪个子节点的内容, .string 的输出结果是 None :


print(soup.html.string)

# None


父节点


继续分析文档树,每个tag或字符串都有父节点:被包含在某个tag中


.parent


通过 .parent 属性来获取某个元素的父节点.在例子“The s story”的文档中,<head>标签是<title>标签的父节点:


title_tag = soup.title

title_tag

# <title>The s story</title>

title_tag.parent

# <head><title>The Dormouse's story</title></head>


文档title的字符串也有父节点:<title>标签


title_tag.string.parent

# <title>The s story</title>


文档的顶层节点比如<html>的父节点是 BeautifulSoup 对象:


html_tag = soup.html

type(html_tag.parent)

# <class 'bs4.BeautifulSoup'>

BeautifulSoup 对象的 .parentNone:


print(soup.parent)

# None


.parents


通过元素的 .parents 属性可以递归得到元素的所有父辈节点,


兄弟节点


.next_sibling 和 .previous_sibling


在文档树中,使用 .next_sibling 和 .previous_sibling 属性来查询兄弟节点:


sibling_soup.b.next_sibling

# <c>text2</c>


sibling_soup.c.previous_sibling

# <b>text1</b>


实际文档中的tag的 .next_sibling 和 .previous_sibling 属性通常是字符串空白。


如果想学习更多科技知识,可以点击关注


如果对文章中的内容有什么困惑的地方,可以在评论区提出自己的问题,学记同大家一起交流,解决各种问题,一起进步。


青年学记 陪伴着各位青年



作者:青年学记 一名不断进步的程序


一起学习 一起进步


走向自立

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表