python模块之beautifulsoup —— html文件解析以及提取

python模块之beautifulsoup —— html文件解析以及提取

beautifulsoup简称bs4,能够帮助我们处理html等超标记文本的标签,提取其中的文字,常用于爬虫领域等。

bs4及相关模块的安装

安装bs4

pip install bs4 -i https://pypi.tuna.tsinghua.edu.cn/simple/   # 清华源下载

安装lxml:

pip install lxml

lxml是一种编码格式,在python解释器中,一般都有默认的html编码器,但是效率较低,所以可以一并下载lxml。这些编码格式beautifulsoup解析文本时需要指定和使用。

导入bs4模块:

from bs4 import BeautifulSoup

bs4基础结构

汤对象和标签对象

创建汤对象soup = BeautifulSoup(html_content, 'lxml')

  • 第一个参数,超标记文本的文本数据

    这个参数可以是str字符串,也可以是open()函数

  • 第二个参数,lxml是编码解析器,还有默认的html解析器等。

汤对象拥有文本的数据属性,拥有DOM节点的定位筛选功能,筛选得到的对象我们将其认作标签对象。传入的内容,会自动将在外侧套html标签。

标签对象有一数据属性可以取到标签的类型、属性、文本等,还拥有一些方法可以判断标签是否有某种属性等,标签对象拥有__str__方法,这个对象显示时以标签原文本显示。

汤对象方法汇总

本身的字符属性*

我们可以通过打印等操作拿到传入beatifulsoup对象的标签文本。

soup = BeautifulSoup('<a href="#" class="c1" >一个链接</a><a>内容</a>', 'lxml')
print(soup)  # <a href="#" class="c1" >一个链接</a><a>内容</a>

但是想要存储这整段文本,应该怎么做呢?

错误的想法是,存储变量=soup

因为soup本身还是个对象,虽然我们打印它是一段字符串,这种情况就需要扩展一下__str__的用法了

之前介绍双下str方法,只说在执行打印操作时会按照它返回的字符串打印。而实际使用str(soup)方法,也可以拿到双下str返回的字符串,这意味着我们不仅能将其打印终端,还可以对这个字符串进行其他操作。

根据标签类型查找节点

soup是汤对象,汤对象点标签名可以得到文本中的第一个对应标签,这个标签对象可以点出一些属性。

soup = BeautifulSoup('<a href="#" class="c1" >一个链接</a><a>内容</a>', 'lxml')

soup.a   # 找到文本中的第一个a标签
--><a href="#" class="c1" >一个链接</a>

soup.a.name  # 拿到标签的名字
-->a

soup.a.attrs  # 拿到标签的所有属性和值对应的字典
-->{'href': '#', 'class': ['c1']}

find方法

特点是返回一个标签对象

soup.find('a')  # 找到第一个a标签,等同于soup.a
soup.find('a', class_='c1')   # 找到第一个类属性含c1的a标签

ps:soup.find()内不加参数,则会返回最大的html标签

find_all方法

特点是返回一个标签对象列表,我们可以遍历列表得到标签对象逐个获得拿到标签数据。

soup = BeautifulSoup('<a href="#" class="c1" >一个链接</a><a>内容</a>', 'lxml')

soup.find_all('a')
--> [<a class="c1" href="#">一个链接</a>, <a>内容</a>]

select方法

可以按照css选择器来筛选标签,也意味着可以按照id选择、类选择器、属性选择器、组合选择器等方式筛选数据。而最终结果得到的是标签对象的列表。

soup = BeautifulSoup('<a href="#" class="c1" >一个链接</a><a href=''>内容</a>', 'lxml')

soup.select('[href="#"]')
--> [<a class="c1" href="#">一个链接</a>]

text属性

剔除所有标签,拼接所有文本数据

soup = BeautifulSoup('<a>aaa<u>hhh</u></a>', 'lxml')
soup.text
--> aaahhh

name属性

soup对象可以使用标签对象的大部分功能,但是其name属性由于不是具体的标签,所以被冠以特殊的标识[document]

标签对象方法汇总

属性、方法 含义 结果演示
.name 标签类型 a标签对象.name --> a
.attrs 标签属性字典
.text 标签内部文本 嵌套的标签也会剔除<标签>的内容,只保留文本
.string 内部文本的修改入口 tag.string = 'new'与text只读相对应
.decomposed() 将标签从soup的节点树中删除 [tag.decomposed() for tag in soup.find_all('script')]

上述就是针对标签的改查删功能,处理结果对它所属的beautifulsoup对象也同样生效。

lxml解析器xpath查找方法

上文已经介绍了如何通过bs4模块查找定位标签,并获取一些属性,而他所引用的lxml解析器,本身也有一套xpath的查找方法。这里简要的介绍一下。

如果能够掌握上述的方法,这里的xpath建议略过,笔者整理的也很随便。

from lxml import etree

html = etree.HTML(doc)  # lxml解析树对象(解析的是html文档,指定doc字符串或文档)
html.xpath('//*')  # 使用xpath查找去获取dom树的内容
语法 含义
/ 当前路径下
/div 当前路径下的div标签
// 递归查找,子子孙孙
//div 递归查找所有的div标签
@ 取属性
. 当层
.. 上一层
//* 所有层的所有标签
//body//a body标签中的所有a标签
//body/a[1] body标签中的顶级a标签的第一个

xpath语法菜鸟教程
xpath实例菜鸟教程

更多详情

以上内容是根据下文链接的文档简单总结而来:

bs4-官方文档

posted @ 2023-01-14 21:01  leethon  阅读(1463)  评论(0编辑  收藏  举报