Skip to content
Switch branches/tags


Like jq, but for HTML. Uses CSS selectors to extract bits of content from HTML files.



cargo install htmlq


brew install htmlq


$ htmlq -h
htmlq 0.3.0
Michael Maclean <>
Runs CSS selectors on HTML

    htmlq [FLAGS] [OPTIONS] [selector]...

    -B, --detect-base          Try to detect the base URL from the <base> tag in the document. If not found, default to
                               the value of --base, if supplied
    -h, --help                 Prints help information
    -w, --ignore-whitespace    When printing text nodes, ignore those that consist entirely of whitespace
    -p, --pretty               Pretty-print the serialised output
    -t, --text                 Output only the contents of text nodes inside selected elements
    -V, --version              Prints version information

    -a, --attribute <attribute>    Only return this attribute (if present) from selected elements
    -b, --base <base>              Use this URL as the base for links
    -f, --filename <FILE>          The input file. Defaults to stdin
    -o, --output <FILE>            The output file. Defaults to stdout

    <selector>...    The CSS expression to select [default: html]


Using with cURL to find part of a page by ID

$ curl --silent | htmlq '#get-help'
<div class="four columns mt3 mt0-l" id="get-help">
        <h4>Get help!</h4>
          <li><a href="">Documentation</a></li>
          <li><a href="">Ask a Question on the Users Forum</a></li>
          <li><a href="">Check Website Status</a></li>
        <div class="languages">
            <label class="hidden" for="language-footer">Language</label>
            <select id="language-footer">
                <option title="English (US)" value="en-US">English (en-US)</option>
<option title="French" value="fr">Français (fr)</option>
<option title="German" value="de">Deutsch (de)</option>


Find all the links in a page

$ curl --silent | htmlq --attribute href a

Get the text content of a post

$ curl --silent | htmlq  --text .main

          About NixOS

NixOS is a GNU/Linux distribution that aims to
improve the state of the art in system configuration management.  In
existing distributions, actions such as upgrades are dangerous:
upgrading a package can cause other packages to break, upgrading an
entire system is much less reliable than reinstalling from scratch,
you can’t safely test what the results of a configuration change will
be, you cannot easily undo changes to the system, and so on.  We want
to change that.  NixOS has many innovative features:


Pretty print HTML

(This is a bit of a work in progress)

$ curl --silent | htmlq --pretty '#posts'
<section id="posts">
  <h2>I write about...
  <ul class="post-list">
      <time datetime="2019-04-29 00:%i:1556496000" pubdate="">
        29/04/2019</time><a href="/weblog/nettop/">
        <h3>Debugging network connections on macOS with nettop
      <p>Using nettop to find out what network connections a program is trying to make.

Syntax highlighting with bat

$ curl --silent | htmlq 'body' | bat --language html
Syntax highlighted output