如果你觉得网页只是一些好看的图片和文字,那我要告诉你一个消息:网页就像洋葱——有很多层,当你发现可以提取那么多数据时,会让你感动得想哭(当然是开心的泪水)。今天我们会使用 BeautifulSoup
挖掘 HTML 页面。准备好你的“虚拟铲子”,让我们开始挖掘吧!
1. 分析 HTML 文档
简单的网页
让我们分析一些简单的 HTML 文档,看看它们由哪些部分组成,以及哪些元素是我们提取数据时值得注意的。
新闻页面的例子:
<html>
<head>
<title>新闻</title>
</head>
<body>
<h1>今日头条</h1>
<p>今天发生了一件大事!</p>
</body>
</html>
在这个例子里,h1
包含文章标题,而
p
包含正文内容。
HTML 结构对数据抓取的影响
在使用 BeautifulSoup
之前,了解你想要解析的 HTML 文档的结构非常重要。
这能帮助我们确定哪些页面部分包含所需的数据。
比如,如果你需要找页面标题,可以关注 <h1>
,
而提取列表时,可以使用 <ul>
和 <li>
。
抓取前的准备工作
开始提取数据之前,必须先找到关键的标签和属性。
比如,如果网页开发者在页面中用 class="headline"
属性标记标题内容,这将对你非常有帮助。
使用浏览器的开发工具,右键点击元素并选择 "Inspect"
(在 Google Chrome 中)来研究 HTML 结构。
2. 安装和配置库
安装 BeautifulSoup
和 requests
为了处理 HTML,我们会用到 BeautifulSoup
库。
而为了加载 HTML 页面,我们需要 requests
。安装过程很简单,只需要在控制台执行几条命令:
pip install beautifulsoup4 requests
结合 requests 和 BeautifulSoup
使用
Requests 可以帮助我们向网页请求 HTML 内容,而 BeautifulSoup
能解析这些内容。下面是实践中的例子:
import requests
from bs4 import BeautifulSoup
# 加载页面
url = 'https://example.com'
response = requests.get(url)
# 使用 BeautifulSoup 解析页面
soup = BeautifulSoup(response.text, 'html.parser')
# 提取页面标题
title = soup.title.text
print('标题:', title)
3. 通过标签导航和提取数据
导航方法
现在我们已经有了 HTML 文档,可以通过 BeautifulSoup
导航其中。
超棒的 .select()
方法允许我们使用 CSS 选择器提取数据。
通过标签提取数据
BeautifulSoup
提供了一些方法,比如 find
和 find_all
,用来根据标签找到元素。
它们帮助你找到想要的数据碎片:
# 找到第一个段落
paragraph = soup.find('p').text
print('第一个段落:', paragraph)
# 找到所有列表项
list_items = soup.find_all('li')
for item in list_items:
print('列表项:', item.text)
使用属性进行过滤
某些情况下,需要提取符合特定条件的元素,比如拥有某个 class
的元素。
BeautifulSoup
提供了简单的方法:
# 提取拥有特定 class 的元素
headline = soup.find('h1', class_='main-headline').text
print('标题:', headline)
4. 使用 CSS 选择器
什么是 CSS 选择器?
CSS 选择器是 Python 开发者的超级工具,允许我们根据特定条件提取数据。 它们能用来找到具有共同样式的元素,令数据抓取更灵活、更精准。
在 BeautifulSoup
中使用选择器
BeautifulSoup
通过 select
方法支持 CSS 选择器。比如:
# 查找所有链接
links = soup.select('a')
for link in links:
print('链接:', link['href'])
你甚至可以组合选择器进行更精准的查询。
比如,soup.select('div.article h2')
会选中所有
div
中的 h2
,且 div
拥有 article
类。
使用 CSS 选择器进行查找的示例
实践一下我们的技能,提取所有带有 highlight
类的段落并打印它们的内容:
# 提取所有带 'highlight' 类的段落
highlighted_paragraphs = soup.select('p.highlight')
for para in highlighted_paragraphs:
print('高亮段落:', para.text)
今天先到这里,在下一次见面前别忘了多多练习你的抓取技能。祝你在解析的世界里玩得开心!
GO TO FULL VERSION