BeautifulSoup4解析数据
BeautifulSoup4(简称bs4)和正则表达式都能处理文本,筛选数据,但它们各有优势和适用场景。在网络爬虫项目中,通常会结合两个工具适用,例如用bs4解析网页结构,然后使用正则表达式提取特定的文本内容。
bs4是用于解析html和xml文档的第3方库,它本身并不直接解析文档,而是依赖于其它解析器来完成这项工作。bs4和解析器的关系可以理解为一个接口和后端服务的关系。
首先在cmd中输入pip install bs4
,或在anaconda prompt中输入conda install bs4
在cmd中输入pip show bs4
和pip show beautifulsoup4
结果如下:
Name: bs4
Version: 0.0.2
Summary: Dummy package for Beautiful Soup (beautifulsoup4)
Home-page:
Author:
Author-email: Leonard Richardson <leonardr@segfault.org>
License: MIT License
Location: C:\Users\89660\AppData\Local\Programs\Python\Python312\Lib\site-packages
Requires: beautifulsoup4
Required-by:
-----------------------------------------------------------------------------------
Name: beautifulsoup4
Version: 4.12.3
Summary: Screen-scraping library
Home-page: https://www.crummy.com/software/BeautifulSoup/bs4/
Author:
Author-email: Leonard Richardson <leonardr@segfault.org>
License: MIT License
Location: C:\Users\89660\AppData\Local\Programs\Python\Python312\Lib\site-packages
Requires: soupsieve
Required-by: bs4
bs4处理对象的过程只包含有4种类型的对象:Tag、NavigableString、BeautifulSoup、Comment
BeautifulSoup对象是整个文档的根节点,提供了许多方便的方法来导航和搜索文档树。BeautifulSoup对象通过BeautifulSoup(html文档, 解析器)
创建。
Tag是html或xml文档中的一个标签
from bs4 import BeautifulSoup
# 待解析的html文档
html = '''
<html>
<head>
<title>Page Title</title>
</head>
<body>
<div class="info" float='right'>
<p class="text">A paragraph</p>
<span>spider</span>
<strong><!--this is a comment--></strong>
</div>
</body>
</html>
'''
# 调用BeautifulSoup()函数,将html文档传递给指定解析器解析,并返回一个BeautifulSoup对象
soup = BeautifulSoup(html, 'html.parser')
# ----获取<title>标签----
title_tag = soup.title
print(title_tag)
# ----获取<span>标签的名称----
span_tag_name = soup.span.name
print(span_tag_name)
# ----获取标签的属性----
# 获取div标签的所有属性
attrs = soup.div.attrs
print(attrs) # {'class': ['info'], 'float': 'right'}
# 获取div标签的单个属性
attr_class = soup.div['class'] # ['info']
attr_float = soup.div.get('float') # right
print(attr_class, attr_float)
NavigableString意为可导航字符串,NavigableString对象代表了标签(Tag)内的文本内容
可以使用Tag对象的.string
属性获取单个子节点的文本内容,(如果Tag对象包含多个子节点,或没有子节点,或子节点不是文本节点,.string
将返回None),Tag对象的.strings
或.stripped_strings
属性可以遍历标签内所有文本内容,返回的是一个迭代器,每个元素都是NavigableString对象。
# <strong><!--this is a comment--></strong>
title_string = soup.title.string
strong_string = soup.strong.string
print(type(title_string)) # <class 'bs4.element.NavigableString'>
print(type(strong_string)) # <class 'bs4.element.Comment'>
print(title_string) # Page Title
print(strong_string) # this is a comment
# .text属性用于获取标签内所有文本内容的字符串,包括所有子标签内的文本。
# 它会返回一个字符串,其中包含标签内所有文本节点的内容,文本之间默认以空格分隔
print(soup.title.text) # Page Title
print(soup.strong.text) #
# <strong><!--this is a comment-->strong</strong>
title_string = soup.title.string
strong_string = soup.strong.string
print(type(title_string)) # <class 'bs4.element.NavigableString'>
print(type(strong_string)) # <class 'NoneType'>
print(title_string) # Page Title
print(strong_string) # None
# .text属性用于获取标签内所有文本内容的字符串,包括所有子标签内的文本。
# 它会返回一个字符串,其中包含标签内所有文本节点的内容,文本之间默认以空格分隔
print(soup.title.text) # Page Title
print(soup.strong.text) # strong
Comment对象代表文档中的注释内容,Comment是一个特殊的NavigableString对象。