diff --git a/ablog/blog.py b/ablog/blog.py
index b6b39f2f..2f768230 100644
--- a/ablog/blog.py
+++ b/ablog/blog.py
@@ -435,8 +435,11 @@ def to_html(self, pagename, fulltext=False, drop_h1=True):
             else:
                 doctree.append(deepcopy)
         else:
+            excerpt_container = nodes.container()
+            excerpt_container.attributes["classes"].append("ablog-post-excerpt")
             for node in self.excerpt:
-                doctree.append(node.deepcopy())
+                excerpt_container.append(node.deepcopy())
+            doctree.append(excerpt_container)
         app = self._blog.app
         revise_pending_xrefs(doctree, pagename)
         app.env.resolve_references(doctree, pagename, app.builder)
diff --git a/ablog/post.py b/ablog/post.py
index a1149643..1b965389 100644
--- a/ablog/post.py
+++ b/ablog/post.py
@@ -507,6 +507,7 @@ def process_postlist(app, doctree, docname):
         bl.attributes["classes"].append("postlist")
         for post in posts:
             bli = nodes.list_item()
+            bli.attributes["classes"].append("ablog-post")
             bl.append(bli)
             par = nodes.paragraph()
             bli.append(par)
@@ -535,6 +536,7 @@ def process_postlist(app, doctree, docname):
                             ref["names"] = []
                             ref["internal"] = True
                             ref.append(nodes.Text(text_type(item)))
+                            par.attributes["classes"].append("ablog-post-title")
                         else:
                             ref = _missing_reference(app, item.xref, docname)
                         par.append(ref)
@@ -543,6 +545,7 @@ def process_postlist(app, doctree, docname):
             if excerpts and post.excerpt:
                 for enode in post.excerpt:
                     enode = enode.deepcopy()
+                    enode.attributes["classes"].append("ablog-post-excerpt")
                     revise_pending_xrefs(enode, docname)
                     app.env.resolve_references(enode, docname, app.builder)
                     enode.parent = bli.parent
@@ -550,6 +553,7 @@ def process_postlist(app, doctree, docname):
                 if expand:
                     ref = app.builder.get_relative_uri(docname, post.docname)
                     enode = nodes.paragraph()
+                    enode.attributes["classes"].append("ablog-post-expand")
                     refnode = nodes.reference("", "", internal=True, refuri=ref)
                     innernode = nodes.emphasis(text=expand)
                     refnode.append(innernode)
diff --git a/ablog/templates/collection.html b/ablog/templates/collection.html
index 102e31cb..405746dc 100644
--- a/ablog/templates/collection.html
+++ b/ablog/templates/collection.html
@@ -26,8 +26,8 @@ <h1>
   </div>
   {% endfor %} {% else %} {% for post in collection %}
 
-  <div class="section">
-    <h2>
+  <div class="section ablog-post">
+    <h2 class="ablog-post-title">
       <a href="{{ pathto(post.docname) }}{{ anchor(post) }}"
         >{{ post.title }}</a
       >
@@ -44,7 +44,7 @@ <h2>
       {% include "postcard2.html" %}
     </ul>
     {{ post.to_html(collection.docname) }}
-    <p><a href="{{ pathto(post.docname) }}">{{ _("Read more ...") }}</a></p>
+    <p class="ablog-post-expand"><a href="{{ pathto(post.docname) }}"><em>{{ _("Read more ...") }}</em></a></p>
     <hr />
   </div>
   {% endfor %} {% endif %}
diff --git a/tests/test_postlist.py b/tests/test_postlist.py
index 687e49fe..b47d627a 100644
--- a/tests/test_postlist.py
+++ b/tests/test_postlist.py
@@ -19,7 +19,10 @@ def test_postlist(app, status, warning):
 
     html = read_text(app.outdir / "postlist.html")
     assert '<ul class="postlist-style-none postlist simple">' in html
-    assert '<li><p>01 December - <a class="reference internal" href="post.html">post</a></p></li>' in html
+    assert (
+        '<li class="ablog-post"><p class="ablog-post-title">01 December - <a class="reference internal" href="post.html">post</a></p></li>'
+        in html
+    )
 
 
 @pytest.mark.sphinx("html", testroot="postlist", confoverrides={"post_date_format_short": "%Y-%m-%d"})
@@ -29,4 +32,7 @@ def test_postlist_date_format_conf(app, status, warning):
     assert app.statuscode == 0
 
     html = read_text(app.outdir / "postlist.html")
-    assert '<li><p>2020-12-01 - <a class="reference internal" href="post.html">post</a></p></li>' in html
+    assert (
+        '<li class="ablog-post"><p class="ablog-post-title">2020-12-01 - <a class="reference internal" href="post.html">post</a></p></li>'
+        in html
+    )