网页 vs. 网页源代码

在开始之前,需要明确一个非常重要的区别:

网页源代码提取指定内容
(图片来源网络,侵删)
  1. 网页源代码:这是浏览器收到的原始 HTML 文档,它包含了页面的所有结构、文本、链接和标签,你可以通过在浏览器中右键点击“查看网页源代码”来看到它。
  2. 渲染后的网页:这是浏览器解析源代码后,执行了其中的 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 和浏览器驱动

  1. 安装 Selenium:
    pip install selenium
  2. 下载浏览器驱动:

步骤 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 (网络) 面板。

  1. 打开开发者工具 (F12)。
  2. 切换到 Network 标签页。
  3. 刷新网页,你会看到大量的请求列表。
  4. 仔细查看这些请求,特别是 XHR (AJAX) 或 Fetch 类型的请求,这些请求通常负责加载动态数据。
  5. 点击其中一个请求,查看 ResponsePreview 标签页,如果里面是你想要的数据(通常是 JSON 格式),那么恭喜你,找到了数据源!
  6. 复制这个请求的 URL 和请求头(Headers),你就可以在代码中直接使用 requests 来调用这个 API,这比解析整个 HTML 页面要高效得多。

总结与选择

方法 适用场景 优点 缺点
requests + BeautifulSoup 静态网页直接在 HTML 中。 简单、快速、资源消耗低。 无法获取 JS 动态加载的内容。
Selenium 动态网页由 JS 渲染。 功能强大,能模拟真实用户操作,获取完整渲染后的页面。 速度慢,资源消耗大(需要启动浏览器),配置稍复杂。
开发者工具 + API 任何网页,尤其是动态网页。 数据结构清晰(通常是 JSON),获取效率最高,稳定。 需要一定的网络知识来分析请求。
浏览器直接复制 一次性、小量的内容提取。 无需编程,最快。 无法自动化,不适用于大量或重复任务。

对于大多数初学者和常规任务,方法一 (requests + BeautifulSoup) 是首选,当你遇到无法提取的动态内容时,再升级到 方法三 (Selenium)方法四 (分析 API)