Dev.to WebDev 🛠 Dev 👁 0 📖 4 min read

Kiểm tra bài viết có sẵn sàng cho featured snippet không: một script soi heading và câu trả lời

Featured snippet không có markup nào để thêm. Tài liệu của Google nói chủ website không thể đánh dấu trang thành đoạn trích nổi bật; Google tự chọn. Nhưng cấu trúc HTML vẫn quyết định Google có tách được câu trả lời gọn

Featured snippet không có markup nào để thêm. Tài liệu của Google nói chủ website không thể đánh dấu trang thành đoạn trích nổi bật; Google tự chọn. Nhưng cấu trúc HTML vẫn quyết định Google có tách được câu trả lời gọn hay không. Bài này viết một script soi những điểm cấu trúc đó.

Cấu trúc Google dễ tách

<h2>Featured snippet là gì</h2>
<p>Featured snippet là khung kết quả đặc biệt trên Google, nơi phần
trả lời được trích từ một trang web hiện lên trước.</p>
<p>Chi tiết, ví dụ, ngoại lệ...</p>

<h2>So sánh RO và Nano</h2>
<table>...</table>   <!-- bảng HTML thật, không phải ảnh -->

Ba nguyên tắc: heading theo câu hỏi người tìm gõ, đoạn đầu dưới heading trả lời thẳng và đủ ý khi đứng một mình, dữ liệu so sánh nằm trong <table> thật. Danh sách các bước có thể là <ol> hoặc chuỗi <h3> nối tiếp.

Script

import re
from bs4 import BeautifulSoup

TU_HOI = ("là gì", "vì sao", "tại sao", "cách", "có nên", "bao nhiêu", "khác", "so sánh", "khi nào")
MO_DAU_RAO_DON = re.compile(r"^(trong thời đại|như chúng ta đã biết|hiện nay|có thể nói)", re.I)

def soi_snippet(html: str) -> list:
    soup = BeautifulSoup(html, "html.parser")
    ket_qua = []
    for h2 in soup.find_all("h2"):
        tieu_de = h2.get_text(strip=True)
        la_cau_hoi = any(t in tieu_de.lower() for t in TU_HOI)
        ke_tiep = h2.find_next_sibling()
        ghi_chu = []
        if not la_cau_hoi:
            ghi_chu.append("heading không ở dạng câu hỏi")
        if ke_tiep is None:
            ghi_chu.append("không có nội dung sau heading")
        elif ke_tiep.name == "p":
            doan = ke_tiep.get_text(" ", strip=True)
            if MO_DAU_RAO_DON.match(doan):
                ghi_chu.append("đoạn đầu mở bằng câu rào đón")
            if len(doan.split()) > 80:
                ghi_chu.append(f"đoạn trả lời dài {len(doan.split())} chữ")
        elif ke_tiep.name == "figure" or ke_tiep.find("img"):
            ghi_chu.append("ảnh đứng ngay sau heading, câu trả lời bị đẩy xuống")
        ket_qua.append((tieu_de, ghi_chu or ["ok"]))
    for img in soup.find_all("img"):
        alt = (img.get("alt") or "").lower()
        if any(k in alt for k in ("bảng", "thông số", "bảng giá")):
            ket_qua.append(("ẢNH", [f"nghi bảng dạng ảnh: {img.get('src')}"]))
    return ket_qua

Giải thích các luật

  • Ngưỡng 80 chữ cho đoạn trả lời là heuristic. Google không công bố độ dài cố định; điều cần là đoạn ngắn, đủ trọn ý khi bị cắt ra khỏi bài.
  • Bảng dạng ảnh: Google không đọc chữ trong ảnh như bảng HTML. Script dò qua alt, nên chỉ bắt được ảnh có alt mô tả là bảng.
  • Script không đánh giá câu trả lời có đúng không, và không biết trang có nằm trong nhóm kết quả tốt của từ khóa không. Đó là điều kiện cần trước khi được xét.

Từ chối đoạn trích

Ngược lại, nếu không muốn một đoạn bị trích, dùng data-nosnippet cho đoạn đó, hoặc nosnippet / max-snippet ở cấp trang. Theo tài liệu của Google, các công cụ này cũng áp dụng cho AI Overview.

Bốn dạng đoạn trích và cách viết câu trả lời cho người viết nội dung có trong bài Featured snippet là gì trên Onic.vn.

Bài gốc: https://onic.vn/kien-thuc/featured-snippet-la-gi/

📰 Read the original article on Dev.to WebDev

Originally published by Dev.to WebDev. Aggregated on AIWithGhost for educational purposes — full credit and traffic to the original publisher.