Python Beautiful Soup 使用示例详解

原创
ithorizon 9个月前 (07-01) 阅读数 143 #Python
目录
  • 一、Beautiful Soup介绍
  • 二、安装 Beautiful Soup
  • 三、解析器
    • 1、Python 标准库解析器(html.parser)
    • 2、第三方解析器(lxml)
    • 3、第三方解析器(html5lib)
    • 4、怎样选择解析器
  • 四、文档树遍历
    • 1、访问节点
    • 2、遍历子节点
    • 3、遍历子孙节点
    • 4、访问父节点和祖先节点
    • 5、查找兄弟节点
  • 五、搜索元素
    • 1、使用标签名搜索
    • 2、使用 CSS 类名搜索
    • 3、使用 id 搜索
    • 4、使用正则表达式搜索
    • 5、搜索嵌套元素
    • 6、约束搜索最终数量
  • 六、提取内容
    • 1、提取文本内容
    • 2、提取链接
    • 3、提取图片链接
    • 4、提取属性值
    • 5、提取特定标签的内容
    • 6、提取表格内容
  • 七、修改文档
    • 1、添加元素
    • 2、删除元素
    • 3、修改属性
    • 4、替换元素
    • 5、插入元素
  • 八、示例

    大家好,在网络爬虫和数据抓取的领域中,Beautiful Soup 是一个备受推崇的 Python 库,它提供了强势而灵活的工具,帮助开发者轻松地解析 HTML 和 XML 文档,并从中提取所需的数据。本文将深入探讨 Beautiful Soup 的使用方法和各种功能,愿望能给大家带来一些帮助。

    一、Beautiful Soup介绍

    Beautiful Soup 是一个 Python 库,用于解析 HTML 和 XML 文档,并提供易懂而直观的 API 来遍历文档树、搜索元素、提取内容等。它的名字取自于《爱丽丝梦游仙境》中的一段描写:“来吧,让我们到漂亮的汤中一起吃面包吧!”正如这句话所暗示的那样,Beautiful Soup 让我们可以轻松地“吃掉”网页中的内容。

    应用场景:

    • 网络爬虫和数据抓取:Beautiful Soup 可以轻松地解析网页 HTML 或 XML 文档,并从中提取所需的数据,用于构建网络爬虫和进行数据抓取。
    • 数据分析和挖掘:通过解析网页中的结构化数据,Beautiful Soup 可以帮助开发者进行数据分析和挖掘,发现数据之间的关系和规律。
    • 网页内容提取:Beautiful Soup 可以提取网页中的各种内容,包括文本、链接、图片、表格等,用于构建内容提取系统和网页分析工具。
    • 自动化测试:Beautiful Soup 可以用于自动化测试框架中,帮助测试人员解析网页内容、验证数据正确性,进行网页元素抓取等操作。
    • 网页数据转换:通过解析网页内容,Beautiful Soup 可以将网页数据变成其他格式,如 JSON、CSV 等,用于数据导出和数据转换。

    优点:

    • 易懂易用:Beautiful Soup 提供了易懂而直观的 API,易于学习和使用,不需要深入了解 HTML 和 XML 的结构。
    • 功能多彩:Beautiful Soup 拥护解析 HTML 和 XML 文档、文档树遍历、元素搜索、内容提取等功能,满足各种数据抓取和分析需求。
    • 解析速度快:使用第三方解析器(如 lxml)可以减成本时间解析速度,适用于大规模数据抓取和分析。
    • 灵活性强:Beautiful Soup 拥护多种解析器和定制化配置,可以基于具体需求进行灵活选择和调整。

    缺点:

    • 解析高效低:相比于一些专门的解析库(如 scrapy),Beautiful Soup 的解析高效相对较低,不适合处理大规模的数据抓取任务。
    • 不拥护异步解析:Beautiful Soup 不拥护异步解析,无法充分利用异步编程模型的优势,或许影响程序的性能和并发能力。
    • 功能相对有限:虽然 Beautiful Soup 提供了多彩的功能和 API,但相比于一些专门的数据分析工具(如 pandas),其功能相对有限,不适合进行繁复的数据处理和分析。

    总的来说,Beautiful Soup 是一个功能强势、易懂易用的 HTML 和 XML 解析库,适用于各种数据抓取和数据分析场景,但在处理大规模数据和需要高性能的场景下或许存在一些约束。

    二、安装 Beautiful Soup

    可以使用 pip 命令来安装 Beautiful Soup:

    pip install beautifulsoup4

    三、解析器

    解析器是 Beautiful Soup 中用于解析 HTML 或 XML 文档的核心组件。Beautiful Soup 拥护多种解析器,包括 Python 标准库的解析器以及第三方解析器,如 lxml 和 html5lib。每种解析器都有其特点和适用场景,可以基于自己的需求选择合适的解析器。

    1、Python 标准库解析器(html.parser)

    Python 标准库中的 html.parser 是一个基于 Python 实现的易懂解析器,速度适中,解析速度不如 lxml,但通常足够应付一般的解析任务。它不需要安装额外的库,是 Beautiful Soup 的默认解析器。

    from bs4 import BeautifulSoup
    # 使用 Python 标准库解析器
    soup = BeautifulSoup(html_doc, 'html.parser')

    2、第三方解析器(lxml)

    lxml 是一个非常敏捷且功能强势的 XML 解析器,它基于 libxml2 和 libxslt 库,拥护 XPath 查询和 CSS 选择器,解析速度比 Python 标准库的解析器更快,通常推荐在性能要求较高的场景中使用。

    from bs4 import BeautifulSoup
    # 使用 lxml 解析器
    soup = BeautifulSoup(html_doc, 'lxml')

    3、第三方解析器(html5lib)

    html5lib 是一个基于 HTML5 规范的解析器,它会基于 HTML5 规范解析文档,拥护最新的 HTML5 元素和属性,解析最终更加正确和稳定。但是,html5lib 的解析速度比较慢,通常在需要最高正确性和稳定性的情况下使用。

    from bs4 import BeautifulSoup
    # 使用 html5lib 解析器
    soup = BeautifulSoup(html_doc, 'html5lib')

    4、怎样选择解析器

    我们在选择解析器时,需要考虑解析速度、内存占用、正确性和稳定性等因素。一般来说,如果对解析速度要求较高,可以选择 lxml 解析器;如果对正确性和稳定性要求较高,可以选择 html5lib 解析器;如果只是进行易懂的数据抓取,可以使用 Python 标准库解析器。

    四、文档树遍历

    文档树遍历是 Beautiful Soup 中常用的操作之一,它允许以树形结构遍历 HTML 或 XML 文档,访问文档中的各个节点、子节点、父节点等。

    1、访问节点

    文档树中的每个元素都是一个节点,可以通过直接访问节点来获取元素的标签名、属性等信息。

    # 获取文档树的根节点
    root = soup.html
    # 获取节点的标签名
    print("Tag name:", root.name)
    # 获取节点的属性
    print("Attributes:", root.attrs)

    2、遍历子节点

    可以使用 .children 属性来遍历节点的子节点,它返回一个生成器,用于逐个访问子节点。

    # 遍历子节点
    for child in root.children:
        print(child)

    3、遍历子孙节点

    可以使用 .descendants 属性来遍历节点的所有子孙节点,包括子节点、子节点的子节点等。

    # 遍历子孙节点
    for descendant in root.descendants:
        print(descendant)

    4、访问父节点和祖先节点

    可以使用 .parent 属性来访问节点的父节点,使用 .parents 属性来遍历节点的所有祖先节点。

    # 访问父节点
    parent = root.parent
    # 遍历祖先节点
    for ancestor in root.parents:
        print(ancestor)

    5、查找兄弟节点

    可以使用 .next_sibling.previous_sibling 属性来访问节点的下一个兄弟节点和上一个兄弟节点。

    # 访问下一个兄弟节点
    next_sibling = root.next_sibling
    # 访问上一个兄弟节点
    previous_sibling = root.previous_sibling

    五、搜索元素

    搜索元素是 Beautiful Soup 中非常常用的功能之一,它允许基于特定的条件来查找文档中的元素,并提取所需的内容。

    1、使用标签名搜索

    可以使用标签名来搜索文档中的元素,通过指定标签名,可以获取所有匹配的元素。

    # 使用标签名搜索
    soup.find_all('div')  # 查找所有 div 元素

    2、使用 CSS 类名搜索

    可以使用 CSS 类名来搜索文档中的元素,通过指定类名,可以获取所有具有指定类名的元素。

    # 使用 CSS 类名搜索
    soup.find_all(class_='class-name')  # 查找所有具有指定类名的元素

    3、使用 id 搜索

    可以使用 id 来搜索文档中的元素,通过指定 id,可以获取具有指定 id 的元素。

    # 使用 id 搜索
    soup.find_all(id='content')  # 查找具有指定 id 的元素

    4、使用正则表达式搜索

    Beautiful Soup 还拥护使用正则表达式来搜索文档中的元素,通过指定正则表达式,可以匹配符合条件的元素。

    import re
    # 使用正则表达式搜索
    soup.find_all(re.compile('^b'))  # 查找所有以 'b' 开头的元素

    5、搜索嵌套元素

    可以通过在搜索方法中传入多个条件来搜索嵌套元素,这样可以更精确地定位到目标元素。

    # 搜索嵌套元素
    soup.find_all('div', class_='class-name')  # 查找所有 class 为 class-name 的 div 元素

    6、约束搜索最终数量

    可以通过 limit 参数来约束搜索最终的数量,这样可以节省内存和减成本时间搜索速度。

    # 约束搜索最终数量
    soup.find_all('a', limit=10)  # 查找前 10 个 a 元素

    六、提取内容

    提取内容是 Beautiful Soup 中的核心功能之一,它允许从 HTML 或 XML 文档中提取出所需的信息和内容。

    1、提取文本内容

    可以使用 .get_text() 方法来提取元素的文本内容,这将返回元素及其子孙节点中的所有文本内容,并将它们合并为一个字符串。

    # 提取文本内容
    text_content = soup.get_text()
    print(text_content)

    2、提取链接

    可以使用 .get('href') 方法来提取链接元素(如 <a> 标签)的链接地址。

    # 提取链接
    for link in soup.find_all('a'):
        print(link.get('href'))

    3、提取图片链接

    可以使用 .get('src') 方法来提取图片元素(如 <img> 标签)的链接地址。

    # 提取图片链接
    for img in soup.find_all('img'):
        print(img.get('src'))

    4、提取属性值

    可以使用 .get() 方法来提取元素的任意属性值,包括标签的 class、id 等属性。

    # 提取属性值
    for element in soup.find_all('div'):
        print(element.get('class'))

    5、提取特定标签的内容

    可以通过搜索特定的标签来提取其内容,例如提取所有 <p> 标签的文本内容。

    # 提取特定标签的内容
    for paragraph in soup.find_all('p'):
        print(paragraph.get_text())

    6、提取表格内容

    可以通过搜索 <table> 标签并遍历其中的 <tr><td> 标签来提取表格中的内容。

    # 提取表格内容
    for table in soup.find_all('table'):
        for row in table.find_all('tr'):
            for cell in row.find_all('td'):
                print(cell.get_text())

    七、修改文档

    修改文档是 Beautiful Soup 中的重要功能之一,它允许对解析后的文档树进行各种修改操作,包括添加、删除、修改元素和属性等。

    1、添加元素

    可以使用 .new_tag() 方法创建一个新的元素,然后使用 .append() 方法将其添加到文档中。

    # 创建新的元素
    new_tag = soup.new_tag('div')
    new_tag.string = 'New content'
    # 将新元素添加到文档中
    soup.body.append(new_tag)

    2、删除元素

    可以使用 .decompose() 方法来删除文档中的元素,将其从文档树中移除。

    # 查找需要删除的元素
    tag_to_delete = soup.find(id='content')
    # 删除元素
    tag_to_delete.decompose()

    3、修改属性

    可以通过修改元素的属性来改变元素的外观和行为,例如修改元素的 class、id 等属性。

    # 查找需要修改属性的元素
    tag_to_modify = soup.find('a')
    # 修改属性
    tag_to_modify['href'] = 'http://www.example.com'

    4、替换元素

    可以使用 .replace_with() 方法来替换文档中的元素,将一个元素替换为另一个元素。

    # 创建新的元素
    new_tag = soup.new_tag('span')
    new_tag.string = 'Replacement content'
    # 查找需要替换的元素
    tag_to_replace = soup.find(id='old-content')
    # 替换元素
    tag_to_replace.replace_with(new_tag)

    5、插入元素

    可以使用 .insert() 方法在文档中插入元素,将新元素插入到指定位置。

    # 创建新的元素
    new_tag = soup.new_tag('div')
    new_tag.string = 'Inserted content'
    # 查找需要插入元素的位置
    target_tag = soup.find(class_='container')
    # 插入元素
    target_tag.insert(0, new_tag)  # 在指定位置插入元素

    八、示例

    from bs4 import BeautifulSoup
    # HTML 文档内容
    html_doc = """
    <html>
    <head>
        <title>Example HTML Page</title>
    </head>
    <body>
        <h1 class="heading">Beautiful Soup Example</h1>
        <p>Welcome to <strong>Beautiful Soup</strong>!</p>
        <a href="http://www.example.com" rel="external nofollow" >Example Link</a>
        <a href="http://www.example.com/page1" rel="external nofollow" >Page 1</a>
        <a href="http://www.example.com/page2" rel="external nofollow" >Page 2</a>
        <div id="content">
            <p>This is some content.</p>
        </div>
    </body>
    </html>
    """
    # 创建 Beautiful Soup 对象并指定解析器
    soup = BeautifulSoup(html_doc, 'html.parser')
    # 1. 解析器
    print("解析器:", soup.builder.NAME)
    # 2. 文档树遍历
    print("文档树遍历:")
    # 遍历子节点
    for child in soup.body.children:
        print(child)
    # 遍历子孙节点
    for descendant in soup.body.descendants:
        print(descendant)
    # 3. 搜索元素
    print("搜索元素:")
    # 使用标签名搜索
    heading = soup.find('h1')
    print("标签名:", heading.name)
    # 使用 CSS 类名搜索
    heading = soup.find(class_='heading')
    print("CSS 类名:", heading.name)
    # 使用 id 搜索
    content_div = soup.find(id='content')
    print("id:", content_div.name)
    # 使用正则表达式搜索
    for tag in soup.find_all(re.compile('^a')):
        print("正则表达式:", tag.name)
    # 4. 提取内容
    print("提取内容:")
    # 提取文本内容
    text_content = soup.get_text()
    print("文本内容:", text_content)
    # 提取链接
    for link in soup.find_all('a'):
        print("链接:", link.get_text(), link.get('href'))
    # 提取图片链接
    for img in soup.find_all('img'):
        print("图片链接:", img.get('src'))
    # 5. 修改文档
    print("修改文档:")
    # 添加元素
    new_tag = soup.new_tag('div')
    new_tag.string = 'New content'
    soup.body.append(new_tag)
    print("添加元素后的文档:", soup)
    # 删除元素
    tag_to_delete = soup.find(id='content')
    tag_to_delete.decompose()
    print("删除元素后的文档:", soup)
    # 修改属性
    heading = soup.find('h1')
    heading['class'] = 'header'
    print("修改属性后的文档:", soup)
    # 替换元素
    new_tag = soup.new_tag('span')
    new_tag.string = 'Replacement content'
    tag_to_replace = soup.find(id='old-content')
    tag_to_replace.replace_with(new_tag)
    print("替换元素后的文档:", soup)
    # 插入元素
    new_tag = soup.new_tag('div')
    new_tag.string = 'Inserted content'
    target_tag = soup.find(class_='container')
    target_tag.insert(0, new_tag)
    print("插入元素后的文档:", soup)

    这个示例代码涵盖了 Beautiful Soup 的解析、搜索、提取、修改等功能,包括了解析器的选择、文档树的遍历、搜索元素、提取内容和修改文档等方面。大家可以基于需要修改示例代码,并尝试在实际项目中应用 Beautiful Soup 进行数据抓取和分析。

    到此这篇涉及Python Beautiful Soup 使用详解的文章就介绍到这了,更多相关Python Beautiful Soup 使用内容请搜索IT视界以前的文章或继续浏览下面的相关文章愿望大家以后多多拥护IT视界!


    本文由IT视界版权所有,禁止未经同意的情况下转发

    文章标签: Python


    热门