Python BeautifulSoup爬虫技巧总结

2023-04-17 00:00:00 python 爬虫 技巧
  1. 安装及引用

首先需要安装 BeautifulSoup 库,可以使用 pip install beautifulsoup4 命令来安装。安装完成后引用库:

from bs4 import BeautifulSoup
  1. 解析 HTML

使用 BeautifulSoup 清洗 HTML,创建 BeautifulSoup 对象:

html_doc = """
<html>
    <head>
        <title>pidancode.com</title>
    </head>
    <body>
        <div id="intro">
            <h2 class="title">Welcome to pidancode.com</h2>
            <p class="description">This is a website for coding lovers.</p>
        </div>
        <div id="content">
            <h3 class="sub-title">Latest Posts</h3>
            <ul class="post-list">
                <li class="post-item">Post 1</li>
                <li class="post-item">Post 2</li>
                <li class="post-item">Post 3</li>
            </ul>
        </div>
    </body>
</html>
"""

soup = BeautifulSoup(html_doc, 'html.parser')

这里我们传入两个参数,第一个是 HTML 文档,第二个是解析器,这里我们使用默认的 html.parser。

  1. 查找标签

使用 soup.标签名 可以查找到页面中的所有 标签名 对应的标签,返回的是一个列表:

print(soup.title)  # <title>pidancode.com</title>
print(soup.h2)  # <h2 class="title">Welcome to pidancode.com</h2>
print(soup.ul)  # <ul class="post-list">...</ul>

如果我们只想得到标签内的文字,可以使用 .string 属性:

print(soup.title.string)  # pidancode.com
print(soup.h2.string) # Welcome to pidancode.com
  1. 根据属性查找标签

使用 soup.find_all() 可以通过标签名和属性值查找标签,该函数返回的是一个列表。

例如,我们想查找页面中所有 class 属性值为 title 的标签:

title_tags = soup.find_all(class_='title')

for title in title_tags:
    print(title.string)

输出:

Welcome to pidancode.com

另外,也可以使用 soup.select() 方法,该方法可以支持 CSS 选择器语法,也可以根据属性值获取标签,例如:

desc_tags = soup.select('#intro .description')

for desc in desc_tags:
    print(desc.string)

输出:

This is a website for coding lovers.
  1. 遍历文档树

使用 soup.childrensoup.descendants 属性可以遍历文档树。

soup.children 返回的是一个迭代器,包含了当前标签的直接子节点。

soup.descendants 返回的是一个迭代器,包含了当前标签的所有后代节点。

例如,我们想遍历 ul 标签的所有子节点:

ul_tag = soup.find('ul', class_='post-list')

for child in ul_tag.children:
    print(child)

输出:

<li class="post-item">Post 1</li>
<li class="post-item">Post 2</li>
<li class="post-item">Post 3</li>
  1. 修改标签属性

使用 tag['属性名'] 可以修改标签的属性值。

例如,我们想将 id 为 intro 的 div 标签的 class 属性值改为 intro-text:

intro_tag = soup.find(id='intro')
intro_tag['class'] = 'intro-text'
print(intro_tag)

输出:

<div class="intro-text" id="intro">
    <h2 class="title">Welcome to pidancode.com</h2>
    <p class="description">This is a website for coding lovers.</p>
</div>
  1. 创建新标签

使用 BeautifulSoup 可以创建新标签。

例如,我们想创建一个新的 a 标签,指向 pidancode.com:

new_a_tag = soup.new_tag('a')
new_a_tag['href'] = 'http://pidancode.com'
new_a_tag.string = 'pidancode.com'

print(new_a_tag)

输出:

<a href="http://pidancode.com">pidancode.com</a>
  1. 添加标签

使用标签元素的 append()insert() 方法可以向一个标签中添加子标签。

例如,我们想在 id 为 intro 的 div 标签中添加新建的 a 标签:

intro_tag.append(new_a_tag)
print(intro_tag)

输出:

<div class="intro-text" id="intro">
    <h2 class="title">Welcome to pidancode.com</h2>
    <p class="description">This is a website for coding lovers.</p>
    <a href="http://pidancode.com">pidancode.com</a>
</div>
  1. 获取标签的文本内容

使用 tag.get_text() 方法可以获取标签的文本内容。

例如,我们想获取 id 为 intro 的 div 标签下所有标签的文本:

print(intro_tag.get_text())

输出:

Welcome to pidancode.com
This is a website for coding lovers.
pidancode.com
  1. 去除空格和换行符

使用 tag.get_text(strip=True) 可以去除标签的空格和换行符。

例如,我们想去除前面获取的文本中的空格和换行符:

print(intro_tag.get_text(strip=True))

输出:

Welcome to pidancode.comThis is a website for coding lovers.pidancode.com

总结

本篇文章中,我们介绍了使用 BeautifulSoup 进行爬虫的一些基本技巧,包括:解析 HTML、查找标签、根据属性查找标签、遍历文档树、修改标签属性、创建新标签、添加标签、获取标签的文本内容、去除空格和换行符。掌握了这些技巧,我们就能更快、更准确地获取需要的信息。

相关文章