使用 BeautifulSoup 解析 HTML
导航解析树,并使用选择器提取数据。
使用 BeautifulSoup 解析 HTML 是 CoddyKit 上的免费 Python Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Python Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Python Academy 课程共包含 4 节课。
安装 BeautifulSoup
beautifulsoup4 可解析 HTML 和 XML。为了提高速度,请使用 lxml 解析器;如果不想添加依赖,请使用 html.parser。
# pip install beautifulsoup4 lxml
from bs4 import BeautifulSoup
html = "<h1>Hello</h1><p class='intro'>World</p>"
soup = BeautifulSoup(html, "lxml")
print(soup.h1.text) # Hello查找元素
find(tag) 返回第一个匹配的元素。find_all(tag) 返回所有匹配元素组成的列表。
from bs4 import BeautifulSoup
html = "<ul><li>A</li><li>B</li><li>C</li></ul>"
soup = BeautifulSoup(html, "lxml")
print(soup.find("li").text) # A
print([li.text for li in soup.find_all("li")]) # [A,B,C]CSS 选择器
soup.select("css selector") 使用 CSS 语法。soup.select_one() 返回第一个匹配项。
from bs4 import BeautifulSoup
html = '<div class="card"><a href="/p/1">Link 1</a></div>'
soup = BeautifulSoup(html, "lxml")
print(soup.select("div.card a")[0]["href"]) # /p/1
print(soup.select_one("a")["href"]) # /p/1访问属性
像访问字典一样访问标签属性:tag["href"]、tag.get("class", [])。
from bs4 import BeautifulSoup
html = '<a href="https://example.com" class="link external">Click</a>'
soup = BeautifulSoup(html, "lxml")
a = soup.find("a")
print(a["href"]) # https://example.com
print(a.get("class", [])) # ['link', 'external']遍历解析树
使用 .parent、.children、.next_sibling 和 .previous_sibling 遍历这棵树。
from bs4 import BeautifulSoup
html = "<div><h2>Title</h2><p>Para</p></div>"
soup = BeautifulSoup(html, "lxml")
h2 = soup.find("h2")
print(h2.parent.name) # div
print(h2.next_sibling.text) # Para (next sibling)提取文本
tag.get_text(separator=" ", strip=True) 返回标签内的所有文本,并清理其中的空白字符。
from bs4 import BeautifulSoup
html = "<div> <p>Hello</p> <p> World </p> </div>"
soup = BeautifulSoup(html, "lxml")
print(soup.div.get_text(separator=" ", strip=True))
# Hello World使用 requests + BeautifulSoup 进行抓取
使用 requests 获取页面,再使用 BeautifulSoup 解析页面,这是经典的抓取组合。
import requests
from bs4 import BeautifulSoup
url = "https://books.toscrape.com"
r = requests.get(url, timeout=10)
soup = BeautifulSoup(r.text, "lxml")
titles = [h3.find("a")["title"] for h3 in soup.select("article.product_pod h3")]
print(titles[:3])处理相对 URL
使用 urllib.parse.urljoin(base, href) 将相对链接转换为绝对 URL。
from urllib.parse import urljoin
base = "https://example.com/products/"
href = "../about"
print(urljoin(base, href)) # https://example.com/about处理编码
BeautifulSoup 会自动检测编码,但您也可以指定编码,或使用 requests 中的 r.encoding。
import requests
from bs4 import BeautifulSoup
r = requests.get("https://example.com")
print(r.encoding) # e.g. utf-8
soup = BeautifulSoup(r.content, "lxml", from_encoding=r.encoding)修改并序列化
修改解析树,然后使用 str(tag) 或 soup.prettify() 将其转换回 HTML。
from bs4 import BeautifulSoup
html = "<p>Hello <b>world</b></p>"
soup = BeautifulSoup(html, "lxml")
soup.b.decompose() # remove the <b> tag
print(str(soup.p)) # <p>Hello </p>BeautifulSoup 的局限
BS4 可以解析静态 HTML,但无法执行 JavaScript。对于由 JS 渲染的页面,请使用 Playwright 或 Selenium。
# BeautifulSoup: good for static HTML
# Playwright: for JavaScript-rendered SPAs
# Scrapy: for large-scale crawls with pipelines
# pip install playwright
# playwright install
# from playwright.async_api import async_playwright快速检查
在 BeautifulSoup 中,哪个方法会返回与 CSS 选择器匹配的所有元素?
回顾
BeautifulSoup 会将 HTML 解析为可遍历的树。使用 find()/find_all() 搜索标签,使用 select() 使用 CSS 选择器,使用 get_text() 获取清理后的文本。对于静态页面,将它与 requests 配合使用;对于由 JS 渲染的内容,请使用 Playwright。
常见问题解答
「使用 BeautifulSoup 解析 HTML」课时是免费的吗?
是的 — 「使用 BeautifulSoup 解析 HTML」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Python Academy 课程的其余内容,请升级到 CoddyKit PRO。 Python Academy 课程共包含 4 节课。
「使用 BeautifulSoup 解析 HTML」这节课中我会学到什么?
导航解析树,并使用选择器提取数据。 你通过在浏览器中直接运行的动手代码来练习 Python Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Python Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Python Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。
「使用 BeautifulSoup 解析 HTML」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Python Academy 课中编写并运行代码吗?
能。每节 Python Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 使用 requests 和 httpx 发起 HTTP 请求
- 使用 BeautifulSoup 解析 HTML
- 构建 Scrapy 爬虫
- 处理 JavaScript 与反爬措施