1. 回顾 CSS 选择器
欢迎来到我们的世界,这里 HTML 页面不会随便就揭示它的秘密,而需要通过精准的 CSS 选择器。如果你认为 CSS 选择器只用于页面的样式设计(像是让你的网站看起来不那么像乱涂乱画的笔记本),是时候打开你作为爬虫开发者的第三只眼了。今天我们会讲解如何让 CSS 选择器成为你搜寻和提取数据的最爱工具。
CSS 选择器,就像是具象化的甜言蜜语,可以让我们轻松访问到 HTML 元素。它帮助你确定页面上需要操作的元素。如果 HTML 页面是个迷宫,那么 CSS 选择器就是那根帮助你找到出口的红线。
CSS 选择器示例
- 标签选择器:
p— 选择所有<p>元素(段落)。 - 类选择器:
.classname— 选择所有指定类名的元素。 - ID 选择器:
#idname— 选择指定 ID 的元素。 - 组合选择器:
div > p— 选择所有作为<div>直接子元素的<p>元素。
2. 在 BeautifulSoup 中使用选择器
再见了,没有 CSS 选择器的枯燥生活!现在该更新升级了。假设你碰到一个网站,你必须提取其中所有伟大智者的名言,好在面试时炫一把。为此,我们将使用 select() 方法,它正好与 CSS 选择器配合使用。
select() 和 select_one() 方法
select() 方法会返回所有与选择器匹配的元素列表。而 select_one() 会找到与选择器匹配的第一个元素,就像搜索引擎直接返回你真正需要的,而不是一堆毫无意义的链接。
假设你有一个包含名言的 HTML 页面:
<div class="quote">
<h2 class="author">普希金</h2>
<p class="text">哎呀普希金。</p>
<a href="https://example.com" class="link">阅读更多</a>
</div>
<div class="quote">
<h2 class="author">列宁</h2>
<p class="text">学习,学习,再学习。</p>
<a href="https://example.com" class="link">阅读更多</a>
</div>
<div class="quote">
<h2 class="author">斯大林</h2>
<p class="text">有了人就有了问题,没有人就没有问题。</p>
<a href="https://example.com" class="link">阅读更多</a>
</div>
我们可以这样获取这些名言:
from bs4 import BeautifulSoup
import requests
# 获取页面的 HTML 代码
response = requests.get('http://quotes.toscrape.com/')
soup = BeautifulSoup(response.text, 'html.parser')
# 使用 CSS 选择器找到所有名言
quotes = soup.select('.quote')
for quote in quotes:
text = quote.select_one('.text').get_text()
author = quote.select_one('.author').get_text()
print(f'名言: {text}\\n作者: {author}\\n')
是不是有点魔法的感觉?类名 .quote 帮助我们获取所有标记为名言的元素,而 .text 和 .author 是它们的子元素,可用来提取名言内容和作者。
3. 使用 CSS 选择器的搜索示例
我们来通过一些示例练习,以便你的大脑知道如何应对带有十个类名的 div。使用选择器可以更有针对性地在页面上搜索数据。你可以将它们组合起来,以获得确切的内容。
基于类和标签的选择器
# 从菜单块中查找所有链接
menu_links = soup.select('nav.menu a')
for link in menu_links:
print(link['href'])
基于 ID 的选择器
# 提取页面的主要标题
main_heading = soup.select_one('#main-heading')
print(main_heading.text)
组合选择器
# 查找突出显示部分中的所有段落
highlighted_sentences = soup.select('.highlighted p')
for sentence in highlighted_sentences:
print(sentence.text)
4. 错误及避免方式
作为爬虫开发者,你的工作并不总是像喝杯咖啡那么简单。有时 CSS 选择器可能会失效,比如:
- 页面具有动态内容,所需的元素通过 JavaScript 加载。
- 你访问了一个不存在的选择器(例如类名或 ID 拼错了)。
- HTML 结构发生变化,仿佛你进入了一部寻找目标元素的恐怖片。
为了避免这些问题,请确保你操作的是最新的、静态的 HTML 文档,并查看选择器的正确性。
实际应用
现在你可以将 CSS 选择器用于实际的数据提取项目了。这个技能在创建价格分析工具、获取新闻甚至追踪网站变化时都很实用。最重要的是,即使网站因为 CSS 改变了外观,由于代码依赖的是 HTML 结构而非样式设计,它依然可以正常工作。
GO TO FULL VERSION