首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

第14.10节 Python中使用BeautifulSoup解析http报文:html标签相关属性的访问

  • 23-09-22 14:37
  • 2454
  • 11818
blog.csdn.net

一、 引言
在《第14.8节 Python中使用BeautifulSoup加载HTML报文》中介绍使用BeautifulSoup的安装、导入和创建对象的过程,本节介绍导入后利用BeautifulSoup对象访问相关标签数据。
本节案例中介绍处理的c: emps1.html文件内容如下:






BeautifulSoups使用方法 - 老猿Python - CSDN博客 
 	
  

老猿Python

老猿Python首行

老猿Python第二行

老猿Python第三行

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

创建soup对象的代码如下:

>>> from bs4 import BeautifulSoup
>>> def getsoup():
    fp = open(r'c:	emps1.html',encoding='utf-8')
    soup = BeautifulSoup(fp, 'lxml')
    fp.close()
    print(soup)
    return soup

>>> soup=getsoup()

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

二、 访问标签及其属性数据
通过BeautifulSoup对象可以访问标签对应的html元素、并进一步访问标签的名字、属性、html元素标签对中的内容。

  1. 通过Tag标签获取HTML元素内容
    Tag就是 HTML 中的一个个标签,用 BeautifulSoup 可以很方便地获取 T标签,通过标签名可以获取HTML报文中对应标签的第一个记录。注意标签识别时对大小写敏感(标签应该都是小写)。
    如上面读取文件解析报文构建soap对象后,访问相关的标签的结果:
>>> soup.title
BeautifulSoups使用方法 - 老猿Python - CSDN博客 
>>> soup.p

老猿Python首行

>>> soup.link
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  1. 通过标签获取标签属性
    通过BeautifulSoup对象的标签名的attrs属性可以访问标签的所有属性,返回的属性为一个字典,如果通过标签名加属性名的方法可以访问属性的值。如:
>>> soup.link.attrs
{'href': 'http://iyenn.com/index/link?url=http://iyenn.com/index/link?url=https://blog.csdn.net/LaoYuanPython/article/details/95360624', 'rel': ['canonical']}
>>> soup.link['rel']
['canonical']
>>> soup.link.name
'link'
>>>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

除了读取相关数据外,还可以通过赋值进行内存数据的修改,如:

>>> soup.title = '老猿Python'
  • 1

注意:
 上述通过“BeautifulSoup对象.标签”去访问的数据都是html报文中第一个匹配的标签的内容;
 可以通过“BeautifulSoup对象.标签.attrs”访问标签的所有属性数据,如soup.link.attrs,通过“soup.标签[“属性名”]”访问具体属性的值,如soup.link[‘rel’]。

  1. 无嵌套情况下通过标签获取标签内的文字内容
    当通过标签获取到标签内容后,可以通过标签内容的string属性获取标签内的文字。由于string属性返回内容的类型为bs4.element.NavigableString,所以称获取的文本为NavigableString,如:
>>> soup.title.string
'BeautifulSoups使用方法 - 老猿Python - CSDN博客 '
>>> soup.link

>>> soup.link.string
>>> soup.h1.string
'老猿Python'
>>>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

上面soup.link.string没有数据,是因为link只有标签数据而标签外无内容。我们来看看数据类型:

>>> type( soup.title.string)

>>> soup.title.string[0:10]
'BeautifulS'
>>>
  • 1
  • 2
  • 3
  • 4
  • 5
  1. 标签嵌套情况下通过父标签获取标签内的文字内容,这又分为三种情况:
    1)如果标签里面只有唯一的一个标签无其他内容,那么string会返回最里面嵌套标签对应的内容。如:
>>> soup.div

老猿Python首行

>>> soup.div.string ' 老猿Python首行' >>> soup.div.p.string ' 老猿Python首行' >>>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

2)如果tag包含了1个子节点且本身标签内还有文本内容,无法确认该返回哪个文本内容,因此模块给string 的值为 None。如:

>>> soup.h2

老猿Python第二行

>>> soup.h2.string >>> soup.h2.a >>>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

3)如果tag包含了多个子节点,string 的输出结果也是 None。

>>> soup.h3

老猿Python第三行

>>> soup.h3.string >>> soup.h3.b 老猿Python第三行 >>> soup.h3.b.string '老猿Python第三行' >>>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

三、 嵌套标签节点访问

  1. 通过标签的contents属性,可以访问其下嵌套的所有下级HTML元素,这些该标签下的子标签对应的HTML元素放到一个content 指向的列表中。如:
>>> print(soup.body.contents)
['
', 

老猿Python

, ' ',

老猿Python首行

, ' ',

老猿Python第二行

老猿Python第三行

, ' '] >>>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

注意换行符和空行都会作为一个列表元素返回。
2. 通过标签的children属性也可以访问标签下嵌套的所有HTML元素,只是其类型不是列表,而是一个迭代器。如:

>>> for i in soup.body.children:print(i,end=', ')


, 

老猿Python

, ,

老猿Python首行

, ,

老猿Python第二行

老猿Python第三行

, , >>> >>> type(soup.body.children) >>>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

从上述输出可以看到children与contents还是有换行符和空行。

  1. 访问嵌套标签的所有子孙节点
    escendants 属性可以对标签其下所有层次的节点进行访问,而 children只能访问直接子节点,注意descendants返回的是一个生成器。
>>> type(soup.body.descendants)

>>> for i in soup.body.descendants:print(i,end=', ')


, 

老猿Python

, 老猿Python, ,

老猿Python首行

,

老猿Python首行

, 老猿Python首行, ,

老猿Python第二行

老猿Python第三行

, ,

老猿Python第二行

, 老猿Python第二行, , , ,

老猿Python第三行

, 老猿Python第三行, 老猿Python第三行, , , , , >>>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  1. 访问标签的父节点
    可以通过标签的parent属性访问其直接父节点,如:
>>> soup.b.parent

老猿Python第三行

>>>
  • 1
  • 2
  • 3
  1. 访问标签的所有祖先节点
    通过标签的parents属性可以访问其所有父节点及祖先节点,该值为一个生成器,如:
>>> type(soup.b.parents)

>>> for i in soup.b.parents:print(i.name,i.string)

h3 None
div None
body None
html None
[document] None
>>>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  1. 访问标签的同父节点下的同级兄弟节点
    next_sibling 属性为节点的下一个兄弟节点,previous_sibling 属性为节点的上一个兄弟节点,如果节点不存在,则返回 None,由于空白或者换行也可以被视作一个节点,所以得到的结果可能是空白或者换行。
>>> soup.b.next_sibling

>>> soup.b.pre_sibling
>>>
  • 1
  • 2
  • 3
  • 4
  1. 访问标签的同父节点下的所有同级兄弟节点
    通过next_siblings 和 previous_siblings 属性可以对当前节点的所有兄弟节点迭代访问,如:
>>> for i in soup.h2.next_siblings:print(i)

老猿Python第三行

>>> for i in soup.h3.previous_siblings:print(i)

老猿Python第二行

>>>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  1. 访问标签的前后节点
    通过next_element和previous_element可以访问标签的前后元素,这里的前后是指html文档中当前标签的前一个元素和后一个元素,不论标签层级,只是字符串的位置前后。并且不一定是标签,只要是独立含义的部分。如:
>>> soup.b.next_element
'老猿Python第三行'
>>> soup.b.previous_element

老猿Python第三行

>>>
  • 1
  • 2
  • 3
  • 4
  • 5
  1. 访问标签的所有前后节点
    通过 next_elements 和 previous_elements 的生成器就可以访问当前标签所有前面和后面的html文档解析元素。如:
>>> for n in soup.a.next_elements:
	if n!=None and n.name!=None:print(n.name)

h3
b
a
>>>  for n in soup.head.previous_elements:print(n.name)
None
html
None
>>>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

注意部分元素可能是空行或换行符。

  1. 访问标签的所有内容
    使用标签的contents属性可以访问该标签下的所有元素,如:
>>> soup.div.contents
['
', 

老猿Python第1行

, ' ',

老猿Python第2行

, ' ',

老猿Python第3行

, ' ',

LaoYuanPython第1行

LaoYuanPython第2行

LaoYuanPython第3行

, ' '] >>> soup.h1.contents ['老猿Python第1行'] >>>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

四、 访问对象的所有内容

  1. 通过对象的strings属性迭代访问除标签外的所有内容,包括空行、空白行,如:
>>> for i in soup.head.strings:print(i)


	.textline{color:blue;}




BeautifulSoups使用方法 - 老猿Python - CSDN博客 
>>> 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  1. 通过对象的stripped_strings属性迭代访问所有内容,去除空行、空白行,如:
>>> for i in soup.head.stripped_strings:print(i)
.textline{color:blue;}
BeautifulSoups使用方法 - 老猿Python - CSDN博客
>>>
  • 1
  • 2
  • 3
  • 4

本节介绍了BeautifulSoup对象的主要属性,通过这些属性可以访问特定标签和内容。

老猿Python,跟老猿学Python!
博客地址:http://iyenn.com/index/link?url=https://blog.csdn.net/LaoYuanPython

老猿Python博客文章目录:http://iyenn.com/rec/324322.html
请大家多多支持,点赞、评论和加关注!谢谢!

文章知识点与官方知识档案匹配,可进一步学习相关知识
网络技能树首页概览37513 人正在系统学习中
老猿Python
微信公众号
专注Python相关语言、图像音视频处理、AI
注:本文转载自blog.csdn.net的LaoYuanPython的文章"https://blog.csdn.net/LaoYuanPython/article/details/100746551"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2024 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top