0Pricing
Python Academy · 课时

使用 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 反馈 — 无需本地设置。

此课程中的所有课时

  1. 使用 requests 和 httpx 发起 HTTP 请求
  2. 使用 BeautifulSoup 解析 HTML
  3. 构建 Scrapy 爬虫
  4. 处理 JavaScript 与反爬措施
← 返回 Python Academy