共计 2595 个字符,预计需要花费 7 分钟才能阅读完成。
在上一节中,我们学习了如何使用 requests 模块与网站交互,并保持会话状态。而在网络爬虫中,获取网页只是第一步,更关键的是从网页中提取出我们需要的数据。本节我们将学习一个非常强大的 HTML 解析库——BeautifulSoup,它能帮助我们轻松地从复杂的网页结构中提取信息。
一、BeautifulSoup 简介
BeautifulSoup 是 Python 中最常用的网页解析库之一,它能将 HTML 或 XML 文档解析成一棵树形结构,方便我们像操作 DOM 一样访问、搜索、修改网页元素。
安装命令如下:
pip install beautifulsoup4 lxml
我们同时安装 lxml 解析器,因为它速度快、容错性好。
二、解析 HTML 文档的基本用法
下面我们看一个最简单的例子:
from bs4 import BeautifulSoup
html_doc = """
<html><head><title>Python 学习网 </title></head>
<body>
<p class="title"><b>Python 基础入门 </b></p>
<p class="content"> 欢迎学习 Python 编程!</p>
<a href="http://example.com/one" class="link"> 第一个链接 </a>
<a href="http://example.com/two" class="link"> 第二个链接 </a>
</body></html>
"""
soup = BeautifulSoup(html_doc, "lxml")
print(" 网页标题:", soup.title.text)
print(" 网页第一个段落:", soup.p.text)
print(" 所有链接:", [a["href"] for a in soup.find_all("a")])
执行结果:
网页标题:Python 学习网
网页第一个段落:Python 基础入门
所有链接:['http://example.com/one', 'http://example.com/two']
三、常用的查找方法
BeautifulSoup 提供了多种查找网页元素的方法:
find(tag_name):查找第一个匹配的标签find_all(tag_name):查找所有匹配的标签find(attrs={}):根据属性查找元素select(css_selector):使用 CSS 选择器查找
示例:
print(soup.find("p", class_="content").text)
print(soup.find_all("a"))
print(soup.select("a.link"))
print(soup.select_one("p.title").text)
四、提取元素的属性与文本
在抓取网页时,我们经常需要提取标签中的内容和属性。
link = soup.find("a")
print(" 链接地址:", link["href"])
print(" 链接文字:", link.text)
如果某个属性不存在,可以使用 .get() 方法避免报错:
print(link.get("id", " 没有 ID 属性 "))
五、解析真实网页内容
现在我们结合 requests 模块,获取网页并解析内容:
import requests
from bs4 import BeautifulSoup
url = "https://example.com"
response = requests.get(url)
soup = BeautifulSoup(response.text, "lxml")
for link in soup.find_all("a"):
print(" 文字:", link.text, "| 地址:", link.get("href"))
这样,我们就能从真实网页中批量提取所有链接。
六、CSS 选择器的强大用法
BeautifulSoup 支持 CSS 选择器,这让我们像写前端 CSS 一样轻松定位元素。
常见选择器包括:
.class选择指定类名的标签#id选择指定 ID 的标签tag[attr=value]选择带有特定属性的标签
示例:
soup.select("div.article > p.content")
soup.select("a[href^='http']")
前者表示“选择 div.article 下的p.content”,后者表示“选择所有 href 以 http 开头的 a 标签”。
七、结合循环提取结构化数据
以下示例展示如何提取新闻标题列表:
import requests
from bs4 import BeautifulSoup
url = "https://news.ycombinator.com/"
response = requests.get(url)
soup = BeautifulSoup(response.text, "lxml")
for item in soup.select(".titleline a"):
print(item.text, " -> ", item["href"])
通过这种方式,我们可以抓取网页标题、作者、日期等各种信息。
八、解析复杂结构与层级关系
有时网页嵌套结构较深,我们可以使用 .parent、.children、.next_sibling 等属性遍历节点:
p = soup.find("p", class_="content")
print(" 父节点:", p.parent.name)
print(" 下一个兄弟节点:", p.find_next_sibling())
这些方法有助于处理复杂网页结构。
九、数据清洗与格式化
爬取的数据往往包含多余的空格、换行或 HTML 标签。我们可以使用 .strip()、re 模块或 .get_text() 进行清洗:
text = soup.get_text(separator="\n", strip=True)
print(text)
十、小结
本节学习了使用 BeautifulSoup 解析网页的基本方法,掌握了以下技能:
- 创建
BeautifulSoup对象并指定解析器; - 使用
find()、find_all()、select()搜索元素; - 提取标签的文本和属性;
- 结合
requests模块实现真实网页解析; - 通过 CSS 选择器快速定位目标内容。
下一节,我们将学习如何使用 BeautifulSoup 与 requests 结合,实现一个完整的网页爬虫程序,自动采集网页信息并保存为本地数据文件。