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标签的第一个 |
更多详情
以上内容是根据下文链接的文档简单总结而来: