0Pricing
AI Agents · บทเรียน

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

find(), select(), ตัวเลือก CSS และการดึงเนื้อหาที่มีโครงสร้างจาก HTML

การแยกวิเคราะห์ HTML ด้วย BeautifulSoup เป็นบทเรียน AI Agents ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน AI Agents และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส AI Agents มีบทเรียนทั้งหมด 4 บทเรียน

เหตุใดเอเจนต์จึงต้องแยกวิเคราะห์ HTML

แหล่งข้อมูลจำนวนมากไม่ใช่ API แต่เป็นหน้าเว็บ เมื่อเอเจนต์ต้องดึงข้อมูลที่มีโครงสร้างจาก HTML ก็ต้องแยกวิเคราะห์มาร์กอัปดิบให้เป็นโครงสร้างต้นไม้ที่นำทางได้

BeautifulSoup (bs4) คือไลบรารีมาตรฐานของ Python สำหรับงานนี้ โดยจะแปลง HTML ที่ยุ่งเหยิงให้เป็นอ็อบเจ็กต์ Python ที่คุณสามารถเรียกค้นหาได้อย่างง่ายดาย

การสร้างอ็อบเจ็กต์ BeautifulSoup

ส่ง HTML ดิบและชื่อเครื่องมือแยกวิเคราะห์ให้กับ BeautifulSoup() โดย 'html.parser' มีอยู่ใน Python อยู่แล้วและไม่ต้องติดตั้งเพิ่มเติม หากต้องการแยกวิเคราะห์หน้าขนาดใหญ่ให้เร็วขึ้น สามารถใช้ 'lxml' ซึ่งติดตั้งผ่าน pip ได้

from bs4 import BeautifulSoup
import httpx

# Fetch HTML
response = httpx.get('https://example.com', timeout=10.0)
html = response.text

# Parse it
soup = BeautifulSoup(html, 'html.parser')

# Get the page title
print(soup.title.text)  # 'Example Domain'

find() — ค้นหาองค์ประกอบเดียว

soup.find(tag, attrs) จะส่งคืนองค์ประกอบแรกที่ตรงกัน หรือ None หากไม่พบ คุณสามารถจับคู่ตามชื่อแท็ก คลาส รหัส หรือแอตทริบิวต์ใด ๆ ได้

ตรวจสอบ None ก่อนเรียกใช้เมธอดกับผลลัพธ์เสมอ

from bs4 import BeautifulSoup

html = '<div class="content"><h1>Title</h1><p>Body text here.</p></div>'
soup = BeautifulSoup(html, 'html.parser')

# Find by tag + class
content_div = soup.find('div', class_='content')
if content_div:
    heading = content_div.find('h1')
    print(heading.text)  # 'Title'

# Find by id
sidebar = soup.find('div', id='sidebar')  # None if absent

find_all() — ค้นหาองค์ประกอบหลายรายการ

soup.find_all(tag) จะส่งคืนรายการองค์ประกอบทั้งหมดที่ตรงกัน วนซ้ำผ่านรายการนี้เพื่อดึงข้อมูลจากโครงสร้างที่ปรากฏซ้ำ เช่น รายการในลิสต์ แถวตาราง หรือการ์ดบทความ

from bs4 import BeautifulSoup

html = '<ul><li>Apple</li><li>Banana</li><li>Cherry</li></ul>'
soup = BeautifulSoup(html, 'html.parser')

items = soup.find_all('li')
for item in items:
    print(item.text)  # Apple, Banana, Cherry

# Limit results
first_two = soup.find_all('li', limit=2)

ตัวเลือก CSS ด้วย select()

soup.select('css selector') ช่วยให้คุณใช้ไวยากรณ์ CSS ที่คุ้นเคยได้ วิธีนี้มักกระชับกว่าการเรียกใช้ find() ต่อกันหลายครั้ง โดยเฉพาะเมื่อทำงานกับองค์ประกอบที่ซ้อนกัน

from bs4 import BeautifulSoup

html = '''
<table>
  <tr><td class="name">Alice</td><td class="score">95</td></tr>
  <tr><td class="name">Bob</td><td class="score">87</td></tr>
</table>
'''
soup = BeautifulSoup(html, 'html.parser')

# Select all td elements inside tr inside table
cells = soup.select('table tr td')
for cell in cells:
    print(cell.text)

# Select only name cells
names = soup.select('td.name')
for n in names:
    print(n.text)  # Alice, Bob

ดึงข้อความด้วย .text และ .strip()

.text (หรือ .get_text()) จะส่งคืนเนื้อหาข้อความทั้งหมดภายในองค์ประกอบ รวมถึงแท็กที่ซ้อนอยู่ ใช้ .strip() เพื่อลบช่องว่างด้านหน้าและด้านท้าย ซึ่งมักปรากฏอยู่ใน HTML

from bs4 import BeautifulSoup

html = '<p>  \n  Price: <strong>$29.99</strong>  \n  </p>'
soup = BeautifulSoup(html, 'html.parser')

paragraph = soup.find('p')

# .text includes nested tag content
print(paragraph.text)          # '  \n  Price: $29.99  \n  '
print(paragraph.text.strip())  # 'Price: $29.99'

# get_text with separator
print(paragraph.get_text(separator=' ', strip=True))  # 'Price: $29.99'

ดึงแอตทริบิวต์ด้วย .get()

เข้าถึงแอตทริบิวต์ของแท็ก เช่น href, src และ data-* ได้เหมือนกับพจนานุกรมโดยใช้ .get('attr_name') วิธีนี้จะส่งคืน None อย่างปลอดภัยหากไม่มีแอตทริบิวต์ดังกล่าว

from bs4 import BeautifulSoup

html = '''
<a href="https://example.com/page" data-id="42">Click here</a>
<img src="/images/logo.png" alt="Logo">
'''
soup = BeautifulSoup(html, 'html.parser')

link = soup.find('a')
print(link.get('href'))     # 'https://example.com/page'
print(link.get('data-id'))  # '42'
print(link.get('class'))    # None (no class attribute)

img = soup.find('img')
print(img.get('src'))       # '/images/logo.png'

นำทางในโครงสร้างต้นไม้ที่แยกวิเคราะห์แล้ว

องค์ประกอบของ BeautifulSoup มีความสัมพันธ์ระหว่างองค์ประกอบแม่ ลูก และพี่น้อง ซึ่งคุณสามารถไล่ไปตามความสัมพันธ์เหล่านี้ได้ ใช้ .parent, .children, .next_sibling และ .previous_sibling เพื่อนำทางไปรอบ ๆ องค์ประกอบที่ค้นพบ

from bs4 import BeautifulSoup

html = '''
<div class="article">
  <h2>Headline</h2>
  <p>First paragraph.</p>
  <p>Second paragraph.</p>
</div>
'''
soup = BeautifulSoup(html, 'html.parser')

h2 = soup.find('h2')
print(h2.text)                    # 'Headline'
print(h2.parent['class'])         # ['article']
print(h2.next_sibling.next_sibling.text)  # 'First paragraph.'

ดึงลิงก์ทั้งหมดจากหน้าเว็บ

งานทั่วไปของเอเจนต์คือการรวบรวมลิงก์ทั้งหมดจากหน้าเว็บเพื่อนำไปสำรวจต่อ ค้นหาแท็ก <a> ทั้งหมด แล้วดึงแอตทริบิวต์ href ออกมา โดยกรองรายการที่ว่างเปล่าออก

from bs4 import BeautifulSoup
import httpx

def extract_links(url: str) -> list:
    response = httpx.get(url, timeout=10.0)
    soup = BeautifulSoup(response.text, 'html.parser')

    links = []
    for tag in soup.find_all('a'):
        href = tag.get('href')
        if href and href.startswith('http'):
            links.append(href)
    return links

# urls = extract_links('https://news.ycombinator.com')
# print(urls[:5])

จัดการ HTML ที่มีรูปแบบไม่ถูกต้องอย่างเหมาะสม

HTML ในโลกจริงมักมีข้อผิดพลาด เช่น แท็กที่ไม่ได้ปิด องค์ประกอบที่ไม่ตรงกัน หรือปัญหาการเข้ารหัส เครื่องมือแยกวิเคราะห์ของ BeautifulSoup ยืดหยุ่นและจะพยายามแก้ไขข้อผิดพลาดโดยอัตโนมัติ แต่ควรตรวจสอบ None เสมอเมื่อเข้าถึงองค์ประกอบที่ซ้อนกัน

from bs4 import BeautifulSoup

# Broken HTML — missing closing tags
html = '<div><p>Hello <strong>World</div>'
soup = BeautifulSoup(html, 'html.parser')

# BS4 repairs the tree automatically
print(soup.prettify())
# <div><p>Hello <strong>World</strong></p></div>

# Safe chained access
price = soup.find('span', class_='price')
price_text = price.text.strip() if price else 'N/A'
print(price_text)  # 'N/A'

เครื่องมือเก็บข้อมูลเว็บของเอเจนต์ฉบับสมบูรณ์

นำทุกอย่างมารวมกันเป็นฟังก์ชันเก็บข้อมูลเว็บฉบับสมบูรณ์ ซึ่งเอเจนต์สามารถเรียกใช้เป็นเครื่องมือได้ ฟังก์ชันนี้ดึงหน้าเว็บ แยกวิเคราะห์หน้า แล้วส่งคืนข้อมูลที่มีโครงสร้างในรูปแบบที่เอเจนต์สามารถใช้เหตุผลได้

from bs4 import BeautifulSoup
import httpx

def scrape_article(url: str) -> dict:
    response = httpx.get(url, headers={'User-Agent': 'MyAgent/1.0'}, timeout=10.0)
    response.raise_for_status()
    soup = BeautifulSoup(response.text, 'html.parser')

    title = soup.find('h1')
    paragraphs = soup.find_all('p')

    return {
        'url': url,
        'title': title.text.strip() if title else '',
        'text': ' '.join(p.text.strip() for p in paragraphs[:5]),
        'links': [a.get('href') for a in soup.find_all('a', href=True)][:10]
    }

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

ทดสอบความเข้าใจเกี่ยวกับการแยกวิเคราะห์ HTML ด้วย BeautifulSoup

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

ขณะนี้คุณสามารถดึงข้อมูลที่มีโครงสร้างจากหน้า HTML ภายในเอเจนต์ของคุณได้แล้ว:

  • สร้างอ็อบเจ็กต์ซุปด้วย BeautifulSoup(html, 'html.parser')
  • ใช้ find() สำหรับองค์ประกอบเดียว และ find_all() สำหรับหลายองค์ประกอบ
  • ใช้ select() สำหรับการค้นหาด้วยตัวเลือก CSS
  • ดึงข้อความด้วย .text.strip() และแอตทริบิวต์ด้วย .get('attr')
  • ท่องไปในโครงสร้างต้นไม้ด้วย .parent, .children และองค์ประกอบพี่น้อง

เมื่อใช้ร่วมกับไคลเอ็นต์เอชทีทีพี BeautifulSoup จะช่วยให้เอเจนต์ของคุณสามารถอ่านหน้าเว็บใดก็ได้

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

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

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

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

find(), select(), ตัวเลือก CSS และการดึงเนื้อหาที่มีโครงสร้างจาก HTML คุณปฏิบัติ AI Agents ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

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

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

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

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

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

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

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

  1. ไคลเอ็นต์ HTTP สำหรับตัวแทน: httpx และ requests
  2. การแยกวิเคราะห์ HTML ด้วย BeautifulSoup
  3. การจัดการการแบ่งหน้าและเนื้อหาแบบไดนามิก
  4. แนวปฏิบัติการดึงข้อมูลอย่างรับผิดชอบ
← กลับไปที่ AI Agents