Skip to main content

How to Open HTML Files and URLs in a Browser from Python

This guide explains how to open HTML files and URLs in a web browser from within a Python script. We'll focus on the built-in webbrowser module, which provides a simple and cross-platform way to do this. We'll also briefly touch on alternative approaches like using the subprocess module (which is less portable). Finally, we'll cover how to read and write HTML files, as distinct from displaying them in a browser.

Opening HTML Files and URLs with webbrowser

The webbrowser module is the standard and recommended way to open files or URLs in a web browser. It's built into Python, so you don't need to install anything extra.

Opening a Local HTML File

import webbrowser
import os

file_path = 'index.html'

# Create a simple HTML file for demonstration
html_string = """
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
</head>
<body>
<h2>tutorialreference.com</h2>
<h2 style="background-color: lime;">google.com</h2>
</body>
</html>
"""

with open(file_path, 'w', encoding='utf-8') as html_file:
html_file.write(html_string)

# Open the file in the default browser (new tab if possible)
webbrowser.open_new_tab(f'file://{os.path.realpath(file_path)}')
  • Creates a simple HTML file and opens it in the browser.

  • The webbrowser.open_new_tab() function tries to open the file in a new tab.

  • file:// prefix: When opening local files, you must use the file:// prefix to specify that it's a file path, not a URL.

  • os.path.realpath(file_path): This gets the absolute, normalized path to the file. This is much more reliable than using a relative path, especially if your script might be run from different directories. Using absolute paths avoids ambiguity.

Opening a URL

Opening a URL is even simpler:

import webbrowser

url = "https://docs.python.org/3/library/webbrowser.html"
webbrowser.open_new_tab(url) # Open in a new tab
  • The webbrowser.open_new_tab() method tries to open the URL in a new tab if possible.

Controlling Browser Behavior (new parameter)

The webbrowser.open() function takes an optional new argument:

  • webbrowser.open(url, new=0): Opens in the same browser window (if possible).
  • webbrowser.open(url, new=1): Opens in a new browser window (if possible).
  • webbrowser.open(url, new=2): Opens in a new tab (if possible). This is the same as open_new_tab().
import webbrowser

url = "https://docs.python.org/3/library/webbrowser.html"
webbrowser.open(url, new=1) # Opens the URL in a new browser.

Opening Files with subprocess (Less Portable)

The subprocess module can launch external processes. While you can use it to open a file in the default browser, it's less portable and more complex than using webbrowser. Here's an example for different operating systems:

import os
import subprocess

file_path = 'index.html'
html_string = """
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
</head>
<body>
<h2>tutorialreference.com</h2>

<h2 style="background-color: lime;">google.com</h2>
</body>
</html>
"""

with open(file_path, 'w', encoding='utf-8') as html_file:
html_file.write(html_string)

absolute_file_path = os.path.abspath(file_path)

try:
# Windows
os.startfile(absolute_file_path)
except AttributeError:
try:
# macOS
# Use 'open' command
subprocess.run(['open', absolute_file_path], check=True) # Ensure file exists.
except FileNotFoundError:
try:
# Linux
# Use 'xdg-open' command (more common than 'gnome-open')
subprocess.run(['xdg-open', absolute_file_path], check=True)
except FileNotFoundError:
print("Can not open file. No suitable command found.")
# Consider using webbrowser as a fallback
  • On Windows, os.startfile() opens a file with its associated application. This is the only reliable, built-in cross-platform way to open a file in its default application on Windows.
  • On macOS and Linux, you can use a shell command like open (macOS) or xdg-open (Linux, more common than gnome-open). subprocess.run() is the modern way to execute shell commands. check=True raises an exception if the command fails (e.g., the file doesn't exist).
  • The try/except blocks are needed for checking if the commands exist, before trying to run them, and catching the FileNotFoundError exception if they don't.
warning

Avoid using os.system(): While os.system() might seem simpler, it's less secure and less flexible than subprocess.run(). Avoid os.system() in favor of subprocess.run() or subprocess.Popen().

Reading and Writing HTML File Contents

The previous sections showed how to display an HTML file in a browser. This is completely different from reading or writing the HTML content itself. To work with the content of an HTML file, use standard file I/O:

Writing HTML to a File

file_path = 'index.html'

html_string = """
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
</head>
<body>
<h2>tutorialreference.com</h2>
<h2 style="background-color: lime;">google.com</h2>
</body>
</html>
"""

with open(file_path, 'w', encoding='utf-8') as html_file: # Use encoding
html_file.write(html_string)
  • The with open() statement makes sure to close the file.

Reading HTML from a File

with open(file_path, 'r', encoding='utf-8') as html_file:
print(html_file.readlines()) # Read all lines into a list
#or
#print(html_file.read()) # Read the entire file into a single string

  • The readlines() method reads all lines from the file.
  • The read() method reads the entire file content into a string.

Using codecs.open for reading files

If you encounter encoding issues, the codecs module provides a more robust way to open files with specific encodings:

import codecs

file_path = 'index.html'
html_string = """
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
</head>
<body>
<h2>tutorialreference.com</h2>
<h2 style="background-color: lime;">google.com</h2>
</body>
</html>
"""

with open(file_path, 'w', encoding='utf-8') as html_file: # Use encoding
html_file.write(html_string)

with codecs.open(file_path, 'r', encoding='utf-8') as html_file:
# print(html_file.readlines()) # Read as list
print(html_file.read())
  • The codecs.open() method provides a way to specify encodings when opening files for reading or writing.