การแยกวิเคราะห์ 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- คำขอ HTTP ด้วย requests และ httpx
- การแยกวิเคราะห์ HTML ด้วย BeautifulSoup
- การสร้างสไปเดอร์ Scrapy
- การจัดการ JavaScript และมาตรการป้องกันการดึงข้อมูล