BeautifulSoup4解析数据

BeautifulSoup4(简称bs4)和正则表达式都能处理文本,筛选数据,但它们各有优势和适用场景。在网络爬虫项目中,通常会结合两个工具适用,例如用bs4解析网页结构,然后使用正则表达式提取特定的文本内容。

bs4是用于解析html和xml文档的第3方库,它本身并不直接解析文档,而是依赖于其它解析器来完成这项工作。bs4和解析器的关系可以理解为一个接口和后端服务的关系。

首先在cmd中输入pip install bs4,或在anaconda prompt中输入conda install bs4

在cmd中输入pip show bs4pip 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对象。

posted @ 2024-09-26 19:02  松鼠q  阅读(11)  评论(0编辑  收藏  举报