🐍 BeautifulSoupCode Examples

How To Extract Text With Formatting Using Beautifulsoup

Extract formatted text with BeautifulSoup. Working Python code examples, proxy configuration, error handling, and best practices.

🐍
BeautifulSoup
3 min
Read Time
Copy
Ready Code
2025
Updated
📋 Table of Contents
  1. Overview
  2. Prerequisites
  3. Code Example
  4. Explanation
  5. Proxy Setup
  6. Variations
  7. Error Handling
  8. Best Practices
  9. FAQ

Overview: Extract formatted text

This guide shows you how to extract formatted text using BeautifulSoup. We cover installation, practical code examples, proxy configuration for production, and error handling best practices.

💡
Quick Answer:

See the code example below for a complete, working solution. For production use, pair with Cheapest Proxies rotating residential IPs at $0.99/GB to avoid IP blocks.

Prerequisites & Installation

pip install beautifulsoup4 requests lxml selenium playwright
  # Install Playwright browsers:
  playwright install chromium

Complete Working Code Example

import requests
  from bs4 import BeautifulSoup

  # Configure rotating proxy (Cheapest Proxies - $0.99/GB)
  proxy = {
      'http': 'http://USER:PASS@proxy.cheapest-proxies.com:8000',
      'https': 'http://USER:PASS@proxy.cheapest-proxies.com:8000'
  }

  headers = {
      'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
      'Accept-Language': 'en-US,en;q=0.9',
  }

  response = requests.get('https://example.com', proxies=proxy, headers=headers, timeout=30)
  soup = BeautifulSoup(response.text, 'lxml')

  # Extract formatted text
  elements = soup.find_all('div', class_='target')
  for el in elements:
      print(el.get_text(strip=True))
📋

Replace USER:PASS with your Cheapest Proxies credentials. Available at $0.99/GB.

Step-by-Step Explanation

1

Import Libraries

Import requests for HTTP and BeautifulSoup for parsing. Both are standard Python web scraping tools.

2

Configure Proxy

Route requests through Cheapest Proxies rotating residential IPs. This prevents IP bans at scale.

3

Fetch Page

Make the HTTP request with proxy and realistic browser headers to avoid detection.

4

Extract formatted text

Parse the HTML with BeautifulSoup and extract the target data using CSS selectors or find() methods.

5

Process & Export

Clean the data and export to CSV, JSON, or your database of choice.

Adding Proxies for Production Scale

def scrape_with_retry(url, max_retries=3):
      proxy = {
          'http': 'http://USER:PASS@proxy.cheapest-proxies.com:8000',
          'https': 'http://USER:PASS@proxy.cheapest-proxies.com:8000'
      }
      for attempt in range(max_retries):
          try:
              r = requests.get(url, proxies=proxy, timeout=30)
              r.raise_for_status()
              return BeautifulSoup(r.text, 'lxml')
          except Exception as e:
              print(f"Retry {attempt+1}: {e}")
      return None

Common Variations

CSS Selectors

elements = soup.select("div.product > span.price")

XPath with lxml

tree = html.fromstring(response.content)
  prices = tree.xpath('//span[@class="price"]/text()')

Multiple Attributes

el = soup.find('div', {'class':'x', 'id':'y'})

Recursive Search

el = soup.find('div', class_='x')
  child = el.find('p')

Error Handling Best Practices

from bs4 import BeautifulSoup
  import requests

  def safe_scrape(url, proxy):
      try:
          r = requests.get(url, proxies=proxy, timeout=30)
          r.raise_for_status()
          soup = BeautifulSoup(r.text, 'lxml')
          el = soup.find('div', class_='target')
          return el.get_text(strip=True) if el else None
      except requests.exceptions.ProxyError:
          print("Proxy failed — check credentials")
      except requests.exceptions.Timeout:
          print("Request timed out")
      except requests.exceptions.HTTPError as e:
          print(f"HTTP error: {e.response.status_code}")
      return None

Best Practices

✅ Use lxml Parser

Always pass 'lxml' as the parser: BeautifulSoup(html, 'lxml'). Fastest and most lenient.

✅ Check for None

Always check if find() returns None before accessing attributes to prevent AttributeError.

✅ Rotating Proxies

Use Cheapest Proxies at $0.99/GB for any production workload to avoid IP bans.

✅ Add Delays

Add time.sleep(random.uniform(1, 3)) between requests to stay under rate limits.

FAQ

Why is my BeautifulSoup code returning None? +
The most common reasons: 1) The CSS class or ID changed — inspect the page source to verify. 2) The content is loaded by JavaScript — use Playwright/Selenium instead. 3) The site blocked your IP — use rotating proxies from Cheapest Proxies.
How do I handle JavaScript-rendered pages? +
BeautifulSoup can't execute JavaScript. For JS-heavy pages, use Playwright: playwright chromium with proxy support. Or try Cheapest Proxies' web unblocker which handles JS rendering automatically.
What's the best parser for BeautifulSoup? +
Use 'lxml' for speed and HTML tolerance. Install: pip install lxml. For broken HTML, 'html5lib' is more forgiving but slower.

Related Articles

Ready to Scale Your BeautifulSoup Scraper?

Rotating residential proxies at $0.99/GB — no blocks, no bans, no limits.

Get Cheapest Proxies →