0Pricing
Python Academy · บทเรียน

การแยกวิเคราะห์ HTML ด้วย BeautifulSoup

นำทางต้นไม้การแยกวิเคราะห์และดึงข้อมูลด้วยตัวเลือก

การแยกวิเคราะห์ HTML ด้วย BeautifulSoup เป็นบทเรียน Python Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน 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 ตรวจจับการเข้ารหัสโดยอัตโนมัติ แต่คุณสามารถระบุการเข้ารหัสเองหรือใช้ r.encoding จาก requests ได้

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)

การแก้ไขและการทำให้เป็นอนุกรม

แก้ไขต้นไม้การแยกวิเคราะห์ แล้วแปลงกลับเป็น HTML ด้วย str(tag) หรือ soup.prettify()

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

ตรวจสอบความเข้าใจ

เมธอดใดส่งคืนองค์ประกอบทั้งหมดที่ตรงกับตัวเลือก CSS ใน BeautifulSoup

สรุปทบทวน

BeautifulSoup แยกวิเคราะห์ HTML เป็นต้นไม้ที่สำรวจได้ ใช้ find()/find_all() เพื่อค้นหาแท็ก ใช้ select() สำหรับตัวเลือก CSS และใช้ get_text() เพื่อดึงข้อความที่จัดรูปแบบเรียบร้อย ใช้ร่วมกับ requests สำหรับหน้าเว็บแบบคงที่ และใช้ Playwright สำหรับเนื้อหาที่แสดงผลด้วย JS

คำถามที่พบบ่อย

บทเรียน “การแยกวิเคราะห์ HTML ด้วย BeautifulSoup” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การแยกวิเคราะห์ HTML ด้วย BeautifulSoup” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Python Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Python Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การแยกวิเคราะห์ HTML ด้วย BeautifulSoup”

นำทางต้นไม้การแยกวิเคราะห์และดึงข้อมูลด้วยตัวเลือก คุณปฏิบัติ Python Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Python Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Python Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน

บทเรียน “การแยกวิเคราะห์ HTML ด้วย BeautifulSoup” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Python Academy นี้ได้ไหม

ได้ บทเรียน Python Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. คำขอ HTTP ด้วย requests และ httpx
  2. การแยกวิเคราะห์ HTML ด้วย BeautifulSoup
  3. การสร้างสไปเดอร์ Scrapy
  4. การจัดการ JavaScript และมาตรการป้องกันการดึงข้อมูล
← กลับไปที่ Python Academy