使用 Python 从 HTML 页面获取数据 是一个非常常见的需求,比如:
在 Python 中,通常我们会使用一些强大的库来实现这个功能,最常用的有:
工具/库 | 用途 | 特点 |
---|---|---|
requests | 发送 HTTP 请求,获取 HTML 页面内容 | 简单易用,用于下载网页源码 |
BeautifulSoup(bs4) | 解析 HTML,提取标签、文本、属性等 | 功能强大,使用简单,适合结构化提取 |
lxml | 高性能 HTML/XML 解析库,可与 BeautifulSoup 配合使用 | 速度快,支持 XPath |
Selenium | 用于动态网页(JavaScript 渲染内容)的自动化浏览器控制 | 适合复杂页面,但较重 |
PyQuery | 类似 jQuery 的语法来解析 HTML | 适合熟悉前端选择器的开发者 |
requests
+ BeautifulSoup
(静态页面,最常用)这是最经典、最轻量、最常用的组合,适合 大多数静态 HTML 页面(即不需要执行 JS 就能看到的内容)。
如果尚未安装,先安装:
pip install requests beautifulsoup4
import requests
from bs4 import BeautifulSoup
# 1. 获取 HTML 页面内容
url = 'https://example.com' # 替换为你想爬取的网站
response = requests.get(url)
# 检查请求是否成功
if response.status_code == 200:
html_content = response.text
else:
print(f"请求失败,状态码:{response.status_code}")
exit()
# 2. 使用 BeautifulSoup 解析 HTML
soup = BeautifulSoup(html_content, 'html.parser')
# 3. 获取网页标题
title = soup.title.string
print(f"网页标题: {title}")
# 4. 获取所有的 <a> 标签(链接)
links = soup.find_all('a')
print("\n页面中的链接:")
for link in links:
href = link.get('href')
text = link.text.strip()
if href: # 只输出有链接地址的
print(f"文本: {text} -> 链接: {href}")
假设网页中有一个 <table>
,你想提取表格中的行和列数据:
# 假设网页中有一个表格,例如 <table id="my-table">
table = soup.find('table', {'id': 'my-table'}) # 通过 id 查找
# 或者直接找第一个表格:soup.find('table')
if table:
rows = table.find_all('tr') # 找出所有行
for row in rows:
cols = row.find_all(['th', 'td']) # th 是表头,td 是普通单元格
cols = [col.text.strip() for col in cols]
print(cols) # 打印每一行的所有列数据
else:
print("未找到表格")
requests
获取到的 HTML 可能 不包含你想要的数据,因为数据是通过 AJAX 动态加载进去的。requests
获取该接口数据(更高效、更稳定)🔍 例如:很多网站的数据是通过类似这样的 API 返回的:
https://example.com/api/data?page=1
返回的是 JSON,你可以直接解析,无需解析 HTML。
如果数据确实是 JS 渲染进去的,而且你无法直接找到数据接口,那可以用 Selenium 模拟浏览器加载完整页面后再提取数据。
pip install selenium
你还需要下载对应的浏览器驱动,比如 ChromeDriver,并确保驱动与你的浏览器版本匹配。
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
import time
# 如果你使用 Chrome,请下载 chromedriver,并配置路径
driver_path = '/path/to/chromedriver' # 替换为你的 chromedriver 路径
service = Service(driver_path)
driver = webdriver.Chrome(service=service)
# 打开网页
url = 'https://example.com'
driver.get(url)
# 等待页面加载(可以根据情况使用显式等待更好)
time.sleep(5) # 简单等待5秒,建议用 WebDriverWait
# 获取页面标题
print("页面标题:", driver.title)
# 获取某个元素,比如 class 为 'title' 的元素内容
elements = driver.find_elements(By.CLASS_NAME, 'title') # 或 By.TAG_NAME, By.CSS_SELECTOR
for elem in elements:
print(elem.text)
# 关闭浏览器
driver.quit()
⚠️ Selenium 比较重,适合复杂动态页面,但对性能要求较高,一般优先尝试找 API 接口或用 requests + bs4。