网页 vs. 网页源代码
在开始之前,需要明确一个非常重要的区别:

- 网页源代码:这是浏览器收到的原始 HTML 文档,它包含了页面的所有结构、文本、链接和标签,你可以通过在浏览器中右键点击“查看网页源代码”来看到它。
- 渲染后的网页:这是浏览器解析源代码后,执行了其中的 JavaScript 和 CSS 后,最终呈现给用户的页面,你看到的很多动态内容(如通过 AJAX 加载的数据)在原始源代码中是找不到的。
如果你要提取的内容是静态的、直接写在 HTML 里的,直接解析源代码即可,如果是动态加载的,你需要模拟浏览器行为,或者直接调用提供数据的 API。
使用 Python + requests + BeautifulSoup (最常用、最推荐)
这是处理静态网页最经典、最强大的组合。requests 用于获取网页源代码,BeautifulSoup 用于解析 HTML 并轻松提取内容。
步骤 1: 安装必要的库
如果你还没有安装,请在终端或命令行中运行:
pip install requests pip install beautifulsoup4
步骤 2: 编写 Python 代码
假设我们要从维基百科的“Python”词条页面提取所有。

目标网页: https://en.wikipedia.org/wiki/Python_(programming_language)
-
<h1> - 所有二级标题
<h2>
代码示例:
import requests
from bs4 import BeautifulSoup
# 1. 定义目标 URL
url = 'https://en.wikipedia.org/wiki/Python_(programming_language)'
try:
# 2. 发送 HTTP 请求获取网页源代码
# 使用 headers 模拟浏览器,避免被一些网站屏蔽
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
}
response = requests.get(url, headers=headers)
# 3. 检查请求是否成功 (状态码 200 表示成功)
response.raise_for_status() # 如果请求失败 (404, 500),会抛出异常
# 4. 使用 BeautifulSoup 解析 HTML
# 'html.parser' 是 Python 内置的解析器,简单易用
soup = BeautifulSoup(response.text, 'html.parser')
# 5. 提取指定内容
# --- 示例 1: 提取页面主标题 (h1 标签) ---
# find() 方法用于查找第一个匹配的标签
main_title_tag = soup.find('h1')
if main_title_tag:
main_title = main_title_tag.get_text(strip=True) # get_text() 获取文本内容,strip() 去除首尾空白
print(f"页面主标题: {main_title}")
print("-" * 30)
# --- 示例 2: 提取所有二级标题 (h2 标签) ---
# find_all() 方法用于查找所有匹配的标签,返回一个列表
h2_tags = soup.find_all('h2')
print("所有二级标题:")
for i, h2_tag in enumerate(h2_tags):
# get_text() 同样可以获取标签内的所有文本
# 对于 h2,标题通常在 <span class="mw-headline"> 中
title_text = h2_tag.find('span', class_='mw-headline').get_text(strip=True)
print(f"{i+1}. {title_text}")
except requests.exceptions.RequestException as e:
print(f"请求网页时发生错误: {e}")
except Exception as e:
print(f"处理过程中发生错误: {e}")
如何定位要提取的元素?
这是最关键的一步,你需要打开浏览器,右键点击你想要提取的内容,选择“检查”(Inspect),这会打开开发者工具,并高亮显示该内容对应的 HTML 代码。
- 通过标签名定位:如上面的
soup.find('h1')。 - 通过 ID 定位:ID 是唯一的。
soup.find(id='main-content')。 - 通过 Class 定位:Class 可能不唯一。
soup.find_all('div', class_='article-item')。 - 通过属性定位:可以组合使用标签、属性和值。
soup.find('a', href='/about-us')。
使用 Python + lxml (更快的解析器)
lxml 是一个比 Python 内置的 html.parser 更快、更强大的解析器,对于大型 HTML 文件,性能优势明显。

步骤 1: 安装 lxml
pip install lxml
步骤 2: 修改代码
你只需要在创建 BeautifulSoup 对象时,将解析器换成 'lxml' 即可。
# ... (requests 部分相同) ... soup = BeautifulSoup(response.text, 'lxml') # <-- 只需修改这里 # ... (提取部分代码相同) ...
处理动态加载的网页 (JavaScript 渲染)
对于像 Twitter、微博、电商网站(商品评论、价格)这样的动态网站,requests 只能获取到初始的 HTML,而看不到由 JavaScript 动态生成的内容。
这时你需要使用能模拟浏览器行为的工具。
推荐工具:Selenium
Selenium 可以自动控制一个真实的浏览器(如 Chrome 或 Firefox)来访问网页,等待所有内容加载完成后再获取最终的 HTML 源代码。
步骤 1: 安装 Selenium 和浏览器驱动
- 安装 Selenium:
pip install selenium
- 下载浏览器驱动:
- 如果你使用 Chrome 浏览器,需要下载 ChromeDriver。
- 重要:ChromeDriver 的版本必须与你的 Chrome 浏览器版本匹配,你可以在 Chrome 地址栏输入
chrome://settings/help查看版本。 - 下载地址:https://googlechromelabs.github.io/chrome-for-testing/ (推荐,有稳定版) 或 https://chromedriver.chromium.org/downloads
- 下载后,将
chromedriver.exe(Windows) 或chromedriver(Mac/Linux) 放到你的项目目录或系统 PATH 路径下。
步骤 2: 编写 Selenium 代码
假设我们要从一个动态加载新闻的网站提取新闻标题。
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from bs4 import BeautifulSoup
import time
# 1. 设置 ChromeDriver 路径
# chromedriver 在系统 PATH 中,可以省略此步
# service = Service(executable_path='path/to/your/chromedriver')
# driver = webdriver.Chrome(service=service)
# 或者更简单的方式 (Selenium-manager 能自动找到驱动)
driver = webdriver.Chrome()
# 2. 打开目标网页
url = 'https://example.com/news-dynamic-page' # 替换成你的目标网址
driver.get(url)
# 3. 等待页面加载
# 方法 A: 等待一个特定元素出现 (更健壮)
try:
# 等最多 10 秒,直到 ID 为 'news-list' 的元素加载出来
news_list = driver.find_element(By.ID, 'news-list')
print("新闻列表已加载。")
except:
# 方法 B: 如果没有特定元素,可以简单等待几秒
print("等待页面完全加载...")
time.sleep(5) # 等待 5 秒,让 JS 有足够时间执行
# 4. 获取渲染后的网页源代码
page_source = driver.page_source
# 5. 使用 BeautifulSoup 解析这个新的源代码
soup = BeautifulSoup(page_source, 'html.parser')
# 6. 提取内容
# 假设新闻标题都在 class="news-title" 的 <h3> 标签里s = soup.find_all('h3', class_='news-title')
print("\n提取到的新闻标题:")in news_titles:
print(title.get_text(strip=True))
# 7. 关闭浏览器
driver.quit()
使用浏览器开发者工具直接分析 (非编程)
如果你只是想快速获取一次数据,不想写代码,可以使用开发者工具的 Network (网络) 面板。
- 打开开发者工具 (F12)。
- 切换到 Network 标签页。
- 刷新网页,你会看到大量的请求列表。
- 仔细查看这些请求,特别是
XHR(AJAX) 或Fetch类型的请求,这些请求通常负责加载动态数据。 - 点击其中一个请求,查看 Response 或 Preview 标签页,如果里面是你想要的数据(通常是 JSON 格式),那么恭喜你,找到了数据源!
- 复制这个请求的 URL 和请求头(Headers),你就可以在代码中直接使用
requests来调用这个 API,这比解析整个 HTML 页面要高效得多。
总结与选择
| 方法 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
requests + BeautifulSoup |
静态网页直接在 HTML 中。 | 简单、快速、资源消耗低。 | 无法获取 JS 动态加载的内容。 |
Selenium |
动态网页由 JS 渲染。 | 功能强大,能模拟真实用户操作,获取完整渲染后的页面。 | 速度慢,资源消耗大(需要启动浏览器),配置稍复杂。 |
| 开发者工具 + API | 任何网页,尤其是动态网页。 | 数据结构清晰(通常是 JSON),获取效率最高,稳定。 | 需要一定的网络知识来分析请求。 |
| 浏览器直接复制 | 一次性、小量的内容提取。 | 无需编程,最快。 | 无法自动化,不适用于大量或重复任务。 |
对于大多数初学者和常规任务,方法一 (requests + BeautifulSoup) 是首选,当你遇到无法提取的动态内容时,再升级到 方法三 (Selenium) 或 方法四 (分析 API)。
