Prompt

How can I scrape FAQ content from websites?

Latest observation

Jul 15, 2026 · OpenAI APIWeb search: off

To scrape FAQ content from websites, the basic idea is:

  1. Fetch the page HTML
  2. Find the FAQ section in the markup
  3. Extract the question/answer pairs
  4. Clean and store the data

A simple Python approach uses requests + BeautifulSoup:

import requests
from bs4 import BeautifulSoup

url = "https://example.com/faq"
html = requests.get(url, timeout=10).text
soup = BeautifulSoup(html, "html.parser")

# Example: look for common FAQ structures
faq_items = []

for item in soup.select(".faq-item"):
    question = item.select_one(".faq-question")
    answer = item.select_one(".faq-answer")
    if question and answer:
        faq_items.append({
            "question": question.get_text(strip=True),
            "answer": answer.get_text(" ", strip=True)
        })

for faq in faq_items:
    print(faq["question"])
    print(faq["answer"])
    print("-" * 40)

Common FAQ patterns to look for

FAQ content is often structured as:

  • div.faq-item
  • h3/button for questions
  • div, p, or section for answers
  • accordion components
  • JSON-LD structured data (FAQPage schema)

Check for structured data first

Some sites include FAQ data in schema.org JSON-LD, which is often easier and more reliable to extract:

import requests
from bs4 import BeautifulSoup
import json

url = "https://example.com/faq"
soup = BeautifulSoup(requests.get(url).text, "html.parser")

for script in soup.find_all("script", type="application/ld+json"):
    try:
        data = json.loads(script.string)
        if isinstance(data, dict) and data.get("@type") == "FAQPage":
            for main in data.get("mainEntity", []):
                q = main.get("name")
                a = main.get("acceptedAnswer", {}).get("text")
                print(q, a)
    except Exception:
        pass

If the site uses JavaScript

If the FAQ content loads dynamically, requests may not see it. In that case use a browser automation tool like:

  • Playwright
  • Selenium

Example with Playwright:

from playwright.sync_api import sync_playwright
from bs4 import BeautifulSoup

with sync_playwright() as p:
    browser = p.chromium.launch(headless=True)
    page = browser.new_page()
    page.goto("https://example.com/faq", wait_until="networkidle")
    soup = BeautifulSoup(page.content(), "html.parser")
    browser.close()

Tips

  • Inspect the page with browser dev tools to find selectors.
  • Respect robots.txt, terms of service, and rate limits.
  • Add delays and retries when scraping many pages.
  • Normalize whitespace and HTML entities in extracted text.

If you want, I can also show you:

  • a generic FAQ scraper that auto-detects common patterns,
  • a Playwright version for JavaScript-heavy sites, or
  • how to scrape FAQ data from schema.org JSON-LD automatically.

Observation history

Unlock observation history

Create a free Obsurfable account to unlock historical responses, model comparisons, and deeper brand intelligence.

How did Obsurfable measure this prompt?

Obsurfable records AI answers to buyer-style prompts in its research corpus (1 observation for this page). Metrics are distributions over observations, not a single static ranking.

Which AI systems does Obsurfable collect answers from?

OpenAI, ChatGPT, Google, Gemini, Google AI Mode, Anthropic, Claude, Perplexity, Grok, DeepSeek, Mistral, Copilot, and Meta AI.