A supremely semantic way would be a model used on dukevideo.com.
<ol>
<li>
<span id="lia">
<span class="productImage">
<a href="/Bikes/DVD/American-Chopper/American-Chopper-Series-1.aspx" title="American Chopper Complete Series 1">
<img src="/images/imageCache/bddc1cee608a8fb5927d6521ff1f0eb0.jpg" alt="American Chopper Complete Series 1" />
</a>
</span>
<span class="price">
<dl class="prices">
<dt class="hidden strikethru">Price:</dt>
<dd class="price red">£29.36</dd>
<dt class="hidden">Our Price:</dt>
<dd class="price">£25.36</dd>
</dl>
</span>
<span class="title">
<a href="/Bikes/DVD/American-Chopper/American-Chopper-Series-1.aspx" title="American Chopper Complete Series 1">American Chopper Complete Series 1
</a>
</span>
</span>
<span id="lib">
<input type="image" class="buyLink" src="/images/buy.png" alt="Add to Basket" id="AC1" name="buyProduct_AC1" value="buyProductAC1" />
</span>
</li>
(On the real site the markup has been remade - and invalidated. My successor isu sing DIV inside LIs instead of SPANs)
This semantic markup is quite heavy, but is super semantic. A search engine or screen reader would work well on it. It allowed us to differentiate parts of the product spec in a list form.
Hopefully the classes give an indication what the CSS is doing. eg.:
*.hidden - hides content from screen but not from screen readers, search engines
*.red - makes text red
*.strikethru - strikes-thru text, to give an illustration of slashed pricing
*.title - bolder face