<?xml version="1.0" encoding="utf-8"?>
<feed xml:lang="en-us" xmlns="http://www.w3.org/2005/Atom"><title>Simon Willison's Weblog: microformats</title><link href="http://simonwillison.net/" rel="alternate"/><link href="http://simonwillison.net/tags/microformats.atom" rel="self"/><id>http://simonwillison.net/</id><updated>2009-05-11T14:41:17+00:00</updated><author><name>Simon Willison</name></author><entry><title>[whatwg] Annotating structured data that HTML has no semantics for</title><link href="https://simonwillison.net/2009/May/11/microdata/#atom-tag" rel="alternate"/><published>2009-05-11T14:41:17+00:00</published><updated>2009-05-11T14:41:17+00:00</updated><id>https://simonwillison.net/2009/May/11/microdata/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://lists.whatwg.org/htdig.cgi/whatwg-whatwg.org/2009-May/019681.html"&gt;[whatwg] Annotating structured data that HTML has no semantics for&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Hixie’s proposal for microdata, a simplified RDFa to be included in the HTML5 spec which allows self-contained communities to invent their own microformat-style spec and use it to add structured semantics to their markup. Whether or not you like the proposal itself the explanation is a fascinating read.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/html5"&gt;html5&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ian-hickson"&gt;ian-hickson&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/markup"&gt;markup&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/microdata"&gt;microdata&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/microformats"&gt;microformats&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/rdf"&gt;rdf&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/rdfa"&gt;rdfa&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/semantics"&gt;semantics&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/whatwg"&gt;whatwg&lt;/a&gt;&lt;/p&gt;



</summary><category term="html5"/><category term="ian-hickson"/><category term="markup"/><category term="microdata"/><category term="microformats"/><category term="rdf"/><category term="rdfa"/><category term="semantics"/><category term="whatwg"/></entry><entry><title>Revving up</title><link href="https://simonwillison.net/2009/Apr/12/adactio/#atom-tag" rel="alternate"/><published>2009-04-12T12:29:25+00:00</published><updated>2009-04-12T12:29:25+00:00</updated><id>https://simonwillison.net/2009/Apr/12/adactio/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://adactio.com/journal/1568"&gt;Revving up&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Jeremy Keith advocates adding the revcanonical attribute to regular A elements as well as / instead of hiding it in the head of the document, following the microformats design principle that invisible metadata is less valuable than augmenting visible links. I’ve updated my shorten bookmarklet to handle this case.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/jeremy-keith"&gt;jeremy-keith&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/metadata"&gt;metadata&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/microformats"&gt;microformats&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/revcanonical"&gt;revcanonical&lt;/a&gt;&lt;/p&gt;



</summary><category term="jeremy-keith"/><category term="metadata"/><category term="microformats"/><category term="revcanonical"/></entry><entry><title>Quoting Chris Messina</title><link href="https://simonwillison.net/2009/Feb/9/microformats/#atom-tag" rel="alternate"/><published>2009-02-09T20:46:53+00:00</published><updated>2009-02-09T20:46:53+00:00</updated><id>https://simonwillison.net/2009/Feb/9/microformats/#atom-tag</id><summary type="html">
    &lt;blockquote cite="http://factoryjoe.com/blog/2009/02/06/where-does-data-go-when-it-dies/"&gt;&lt;p&gt;When APIs go dark, how do you do a data backup? (Answer: you often can't.) With public, microformatted content, there will likely be a public archive that can be used to reconstitute at least portions of the service. With dynamic APIs and proprietary data formats, all bets are off.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p class="cite"&gt;&amp;mdash; &lt;a href="http://factoryjoe.com/blog/2009/02/06/where-does-data-go-when-it-dies/"&gt;Chris Messina&lt;/a&gt;&lt;/p&gt;

    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/apis"&gt;apis&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/archiving"&gt;archiving&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/chris-messina"&gt;chris-messina&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/data-portability"&gt;data-portability&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/microformats"&gt;microformats&lt;/a&gt;&lt;/p&gt;



</summary><category term="apis"/><category term="archiving"/><category term="chris-messina"/><category term="data-portability"/><category term="microformats"/></entry><entry><title>Quoting Gordon Luk</title><link href="https://simonwillison.net/2009/Feb/5/microformats/#atom-tag" rel="alternate"/><published>2009-02-05T22:46:36+00:00</published><updated>2009-02-05T22:46:36+00:00</updated><id>https://simonwillison.net/2009/Feb/5/microformats/#atom-tag</id><summary type="html">
    &lt;blockquote cite="http://getluky.net/2009/01/08/a-warning-about-the-real-cost-of-microformats/"&gt;&lt;p&gt;Much like an oral agreement, publishing microformats is an informal agreement between you and (hopefully) a developer community that sets up a relationship with plenty of vagueness, inertial resistance to change, and potential landmines to step on. Would you create a real developer API without a TOS, agreement, or at the very least, guidelines? [...] are you prepared to announce all frontend markup changes? Does publishing a microformat without a special agreement mean that you are implicitly allowing comprehensive scraping of your web data?&lt;/p&gt;&lt;/blockquote&gt;
&lt;p class="cite"&gt;&amp;mdash; &lt;a href="http://getluky.net/2009/01/08/a-warning-about-the-real-cost-of-microformats/"&gt;Gordon Luk&lt;/a&gt;&lt;/p&gt;

    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/apis"&gt;apis&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/gordonluk"&gt;gordonluk&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/microformats"&gt;microformats&lt;/a&gt;&lt;/p&gt;



</summary><category term="apis"/><category term="gordonluk"/><category term="microformats"/></entry><entry><title>Portable Social Networks, The Building Blocks Of A Social Web</title><link href="https://simonwillison.net/2008/Jul/3/portable/#atom-tag" rel="alternate"/><published>2008-07-03T09:08:04+00:00</published><updated>2008-07-03T09:08:04+00:00</updated><id>https://simonwillison.net/2008/Jul/3/portable/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.digital-web.com/articles/portable_social_networks_building_blocks_of_a_social_web"&gt;Portable Social Networks, The Building Blocks Of A Social Web&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Ben Ward’s tour de force of practical tools and techniques for building out the distributed social web, using XFN and hCard to represent the data. If you only read one article on portable social networks, make it this one.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/ben-ward"&gt;ben-ward&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/hcard"&gt;hcard&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/microformats"&gt;microformats&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/portablesocialnetworks"&gt;portablesocialnetworks&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/xfn"&gt;xfn&lt;/a&gt;&lt;/p&gt;



</summary><category term="ben-ward"/><category term="hcard"/><category term="microformats"/><category term="portablesocialnetworks"/><category term="xfn"/></entry><entry><title>Microformats and accessibility: the soap opera that never ends</title><link href="https://simonwillison.net/2008/Jun/29/microformats/#atom-tag" rel="alternate"/><published>2008-06-29T08:44:46+00:00</published><updated>2008-06-29T08:44:46+00:00</updated><id>https://simonwillison.net/2008/Jun/29/microformats/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://diveintomark.org/archives/2008/06/29/microformats-accessibility"&gt;Microformats and accessibility: the soap opera that never ends&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
“Be sure to tune in next week, when we’ll drown a leading accessibility expert to see if she’s a witch.”


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/accessibility"&gt;accessibility&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/funny"&gt;funny&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/mark-pilgrim"&gt;mark-pilgrim&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/microformats"&gt;microformats&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/witch"&gt;witch&lt;/a&gt;&lt;/p&gt;



</summary><category term="accessibility"/><category term="funny"/><category term="mark-pilgrim"/><category term="microformats"/><category term="witch"/></entry><entry><title>Removing Microformats from bbc.co.uk/programmes</title><link href="https://simonwillison.net/2008/Jun/23/microformats/#atom-tag" rel="alternate"/><published>2008-06-23T21:04:27+00:00</published><updated>2008-06-23T21:04:27+00:00</updated><id>https://simonwillison.net/2008/Jun/23/microformats/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.bbc.co.uk/blogs/radiolabs/2008/06/removing_microformats_from_bbc.shtml"&gt;Removing Microformats from bbc.co.uk/programmes&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
“Until these issues are resolved the BBC semantic markup standards have been updated to prevent the use of non-human-readable text in abbreviations.”


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/abbr"&gt;abbr&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/accessibility"&gt;accessibility&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/bbc"&gt;bbc&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/microformats"&gt;microformats&lt;/a&gt;&lt;/p&gt;



</summary><category term="abbr"/><category term="accessibility"/><category term="bbc"/><category term="microformats"/></entry><entry><title>Internet Explorer 8 Readiness Toolkit</title><link href="https://simonwillison.net/2008/Mar/5/internet/#atom-tag" rel="alternate"/><published>2008-03-05T18:28:20+00:00</published><updated>2008-03-05T18:28:20+00:00</updated><id>https://simonwillison.net/2008/Mar/5/internet/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.microsoft.com/windows/products/winfamily/ie/ie8/readiness/DevelopersNew.htm"&gt;Internet Explorer 8 Readiness Toolkit&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
The new built-in development tools look similar enough to Firebug to make me very happy. Also of interest: Selectors API (for fast getElementsBySelector), CSS 2.1 support, support for XHTML style namespaces in HTML, an interesting Web Slices feature based on the hAtom microformat and 6 connections per host (up from 2) which should make Comet easier.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/comet"&gt;comet&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/css"&gt;css&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/hatom"&gt;hatom&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ie8"&gt;ie8&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/javascript"&gt;javascript&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/microformats"&gt;microformats&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/namespaces"&gt;namespaces&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/selectors"&gt;selectors&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/standards"&gt;standards&lt;/a&gt;&lt;/p&gt;



</summary><category term="comet"/><category term="css"/><category term="hatom"/><category term="ie8"/><category term="javascript"/><category term="microformats"/><category term="namespaces"/><category term="selectors"/><category term="standards"/></entry><entry><title>Django People: OpenID and microformats</title><link href="https://simonwillison.net/2008/Jan/24/upgrade/#atom-tag" rel="alternate"/><published>2008-01-24T02:02:19+00:00</published><updated>2008-01-24T02:02:19+00:00</updated><id>https://simonwillison.net/2008/Jan/24/upgrade/#atom-tag</id><summary type="html">
    &lt;p&gt;In hindsight, it was a mistake to launch &lt;a href="http://djangopeople.net/"&gt;Django People&lt;/a&gt; without support for &lt;a href="http://openid.net/"&gt;OpenID&lt;/a&gt;. It was on the original feature list, but in the end I decided to cut any feature that wasn't completely essential in order to get the site launched before it drowned in an ocean of "wouldn't-it-be-cool-ifs".&lt;/p&gt;

&lt;p&gt;I thought that, once launched, the site would see a small amount of activity from a few interested parties and I'd have plenty of time to catch up on the feature backlog. What I didn't expect was that &lt;a href="http://djangopeople.net/about/"&gt;over 750 people&lt;/a&gt; would create profiles within the first 24 hours!&lt;/p&gt;

&lt;p&gt;So, I spent a few hours this evening integrating my current development version of &lt;a href="http://code.google.com/p/django-openid/"&gt;django-openid&lt;/a&gt;, which thankfully had about 80% of the code needed to integrate with Django's built-in authentication mechanism already written. Sadly the other 20% is either incomplete or a bit of a mess, but I've checked it in to &lt;a href="http://django-openid.googlecode.com/svn/branches/auth-integration/"&gt;a branch on Google Code&lt;/a&gt; for anyone who's interested.&lt;/p&gt;

&lt;p&gt;Anyway, there are a few new features on the site of interest to OpenID users:&lt;/p&gt;

&lt;ol&gt;
    &lt;li&gt;When &lt;a href="http://djangopeople.net/signup/"&gt;signing up for a new account&lt;/a&gt;, you now have the option to start by signing in with an OpenID. If you do this, you'll be able to complete the signup form without having to pick a password. If your OpenID provider supports simple registration the name, e-mail address and username fields will be filled in for you.&lt;/li&gt;
    &lt;li&gt;If you already have an existing account, you can &lt;a href="http://djangopeople.net/openid/associations/"&gt;associate one or more OpenIDs&lt;/a&gt; with that account. You'll then be able to use any of them to sign in to the account. Why multiple OpenIDs instead of just one? Two reasons: firstly, it opens the potential for doing interesting things with multiple OpenIDs from different providers in the future; secondly, it gives you a fallback for if one of your OpenID providers becomes unavailable.&lt;/li&gt;
    &lt;li&gt;You can freely add and remove OpenIDs from your associations, with one exception: the site won't let you delete your last OpenID if your account doesn't also have a password associated with it, to prevent you from locking yourself out.&lt;/li&gt;
    &lt;li&gt;While I decided that I didn't want Django People to become &lt;em&gt;yet another&lt;/em&gt; OpenID provider, I do want to give people the ability to use their profile page on the site as an OpenID - so that they can prove that they own it (see my &lt;a href="http://simonwillison.net/2008/Jan/7/projection/" title="Yahoo!, Flickr, OpenID and Identity Projection"&gt;recent post on identity projection&lt;/a&gt;). To that end, the new account settings page lets advanced OpenID users set up an &lt;code&gt;openid.server&lt;/code&gt; and &lt;code&gt;openid.delegate&lt;/code&gt; for their profile page, as described in &lt;a href="http://simonwillison.net/2006/Dec/19/openid/" title="How to turn your blog in to an OpenID"&gt;my blog entry&lt;/a&gt; from just over a year ago.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;One caveat: the site only supports OpenID 1.1, at least for the moment. I had originally planned to go for OpenID 2.0, but demand was such that I decided to get what I had up and running rather than digging in to the OpenID 2.0 libraries.&lt;/p&gt;

&lt;h3&gt;Microformats&lt;/h3&gt;

&lt;p&gt;While I was messing around with OpenID, &lt;a href="http://notes.natbat.net/"&gt;Natalie&lt;/a&gt; was updating the site's templates to clean up the crufty code I'd introduced and add some microformatted goodness. The site now uses &lt;a href="http://microformats.org/wiki/hcard"&gt;hCard&lt;/a&gt; where you would expect it (country listing pages, skill listing pages and the &lt;a href="http://djangopeople.net/search/"&gt;new search interface&lt;/a&gt;) and the profile pages have been updated with a healthy dose of &lt;a href="http://microformats.org/wiki/xfn"&gt;XFN&lt;/a&gt; (just rel="me", since there isn't a relevant microformat for "people who live nearby") and &lt;a href="http://microformats.org/wiki/rel-tag"&gt;Rel-Tag&lt;/a&gt;. On &lt;a href="http://adactio.com/"&gt;Jeremy Keith&lt;/a&gt;'s suggestion, the profile pages also use &lt;a href="http://microformats.org/wiki/hresume"&gt;hResume&lt;/a&gt; - all the more reason to add the Django projects you've worked on to your profile's portfolio.&lt;/p&gt;

&lt;p&gt;As usual, post feedback and bug reports as comments on this entry.&lt;/p&gt;
    
        &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/django"&gt;django&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/django-people"&gt;django-people&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/hcard"&gt;hcard&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/hresume"&gt;hresume&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/identityprojection"&gt;identityprojection&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/microformats"&gt;microformats&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/openid"&gt;openid&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/python"&gt;python&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/reltag"&gt;reltag&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/xfn"&gt;xfn&lt;/a&gt;&lt;/p&gt;
    

</summary><category term="django"/><category term="django-people"/><category term="hcard"/><category term="hresume"/><category term="identityprojection"/><category term="microformats"/><category term="openid"/><category term="python"/><category term="reltag"/><category term="xfn"/></entry><entry><title>Quoting Matt Webb</title><link href="https://simonwillison.net/2008/Jan/1/webb/#atom-tag" rel="alternate"/><published>2008-01-01T12:13:00+00:00</published><updated>2008-01-01T12:13:00+00:00</updated><id>https://simonwillison.net/2008/Jan/1/webb/#atom-tag</id><summary type="html">
    &lt;blockquote cite="http://interconnected.org/home/2007/12/28/wrapping_up_2007"&gt;&lt;p&gt;The technological future of the Web is in micro and macro structure. The approach to the micro is akin to proteins and surface binding--or, to put it another way, phenotropics and pattern matching. Massively parallel agents need to be evolved to discover how to bind onto something that looks like a blog post; a crumb-trail; a right-hand nav; a top 10 list; a review; an event description; search boxes.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p class="cite"&gt;&amp;mdash; &lt;a href="http://interconnected.org/home/2007/12/28/wrapping_up_2007"&gt;Matt Webb&lt;/a&gt;&lt;/p&gt;

    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/matt-webb"&gt;matt-webb&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/microformats"&gt;microformats&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/patternmatching"&gt;patternmatching&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/phenotropics"&gt;phenotropics&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/web"&gt;web&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ai-agents"&gt;ai-agents&lt;/a&gt;&lt;/p&gt;



</summary><category term="matt-webb"/><category term="microformats"/><category term="patternmatching"/><category term="phenotropics"/><category term="web"/><category term="ai-agents"/></entry><entry><title>Unobtrusively Mapping Microformats with jQuery</title><link href="https://simonwillison.net/2007/Dec/12/unobtrusively-mapping-microformats-jquery/#atom-tag" rel="alternate"/><published>2007-12-12T04:05:45+00:00</published><updated>2007-12-12T04:05:45+00:00</updated><id>https://simonwillison.net/2007/Dec/12/unobtrusively-mapping-microformats-jquery/#atom-tag</id><summary type="html">
    &lt;p&gt;&lt;a href="http://microformats.org/"&gt;Microformats&lt;/a&gt; are everywhere. You can&amp;#8217;t shake an electronic stick these days without accidentally poking a microformat-enabled site, and many developers use microformats as a matter of course. And why not? After all, why invent your own class names when you can re-use pre-defined ones that give your site extra functionality for free?&lt;/p&gt;

&lt;p&gt;Nevertheless, while it&amp;#8217;s good to know that users of tools such as &lt;a href="http://blog.codeeg.com/tails-firefox-extension-03/"&gt;Tails&lt;/a&gt; and &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/4106"&gt;Operator&lt;/a&gt; will derive added value from your shiny semantics, it&amp;#8217;s nice to be able to reuse that effort in your own code.&lt;/p&gt;

&lt;p&gt;We&amp;#8217;re going to build a map of some of my favourite restaurants in Brighton. Fitting with the principles of &lt;a href="http://en.wikipedia.org/wiki/Unobtrusive_JavaScript"&gt;unobtrusive JavaScript&lt;/a&gt;, we&amp;#8217;ll start with a semantically marked up list of restaurants, then use JavaScript to add the map, look up the restaurant locations and plot them as markers.&lt;/p&gt;

&lt;p&gt;We&amp;#8217;ll be using a couple of powerful tools. The first is &lt;a href="http://jquery.com/"&gt;jQuery&lt;/a&gt;, a JavaScript library that is ideally suited for unobtrusive scripting. jQuery allows us to manipulate elements on the page based on their &lt;span class="caps"&gt;CSS&lt;/span&gt; selector, which makes it easy to extract information from microformats.&lt;/p&gt;

&lt;p&gt;The second is &lt;a href="http://mapstraction.com/"&gt;Mapstraction&lt;/a&gt;, introduced here by Andrew Turner &lt;a href="https://24ways.org/2007/get-to-grips-with-slippy-maps"&gt;a few days ago&lt;/a&gt;. We&amp;#8217;ll be using &lt;a href="http://code.google.com/apis/maps/" title="The Google Maps API"&gt;Google Maps&lt;/a&gt; in the background, but Mapstraction makes it easy to change to a different provider if we want to later.&lt;/p&gt;

&lt;h3&gt;Getting Started&lt;/h3&gt;

&lt;p&gt;We&amp;#8217;ll start off with a simple collection of microformatted restaurant details, representing my seven favourite restaurants in Brighton. The full, unstyled list can be seen in &lt;a href="https://24ways.org/examples/unobtrusively-mapping-microformats-with-jquery/restaurants-plain.html"&gt;restaurants-plain.html&lt;/a&gt;. Each restaurant listing looks like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;li class=&amp;quot;vcard&amp;quot;&amp;gt;
	&amp;lt;h3&amp;gt;&amp;lt;a class=&amp;quot;fn org url&amp;quot; href=&amp;quot;http://www.riddleandfinns.co.uk/&amp;quot;&amp;gt;Riddle &amp;amp; Finns&amp;lt;/a&amp;gt;&amp;lt;/h3&amp;gt;
	&amp;lt;div class=&amp;quot;adr&amp;quot;&amp;gt;
		&amp;lt;p class=&amp;quot;street-address&amp;quot;&amp;gt;12b Meeting House Lane&amp;lt;/p&amp;gt;
		&amp;lt;p&amp;gt;&amp;lt;span class=&amp;quot;locality&amp;quot;&amp;gt;Brighton&amp;lt;/span&amp;gt;, &amp;lt;abbr class=&amp;quot;country-name&amp;quot; title=&amp;quot;United Kingdom&amp;quot;&amp;gt;UK&amp;lt;/abbr&amp;gt;&amp;lt;/p&amp;gt;
		&amp;lt;p class=&amp;quot;postal-code&amp;quot;&amp;gt;BN1 1HB&amp;lt;/p&amp;gt;
	&amp;lt;/div&amp;gt;
	&amp;lt;p&amp;gt;Telephone: &amp;lt;span class=&amp;quot;tel&amp;quot;&amp;gt;+44 (0)1273 323 008&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;
	&amp;lt;p&amp;gt;E-mail: &amp;lt;a href=&amp;quot;mailto:info@riddleandfinns.co.uk&amp;quot; class=&amp;quot;email&amp;quot;&amp;gt;info@riddleandfinns.co.uk&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;
&amp;lt;/li&amp;gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Since we&amp;#8217;re dealing with a list of restaurants, each hCard is marked up inside a list item. Each restaurant is an organisation; we signify this by placing the classes &lt;code&gt;fn&lt;/code&gt; and &lt;code&gt;org&lt;/code&gt; on the element surrounding the restaurant&amp;#8217;s name (according to the hCard spec, setting both &lt;code&gt;fn&lt;/code&gt; and &lt;code&gt;org&lt;/code&gt; to the same value signifies that the hCard represents an organisation rather than a person).&lt;/p&gt;

&lt;p&gt;The address information itself is contained within a &lt;code&gt;div&lt;/code&gt; of class &lt;code&gt;adr&lt;/code&gt;. Note that the &lt;span class="caps"&gt;HTML&lt;/span&gt; &lt;code&gt;&amp;lt;address&amp;gt;&lt;/code&gt; element is not suitable here for two reasons: firstly, it is intended to mark up contact details for the current document rather than generic addresses; secondly, address is an inline element and as such cannot contain the paragraphs elements used here for the address information.&lt;/p&gt;

&lt;p&gt;A nice thing about microformats is that they provide us with automatic hooks for our styling. For the moment we&amp;#8217;ll just tidy up the whitespace a bit; for more advanced style tips consult &lt;a href="https://24ways.org/2006/styling-hcards-with-css" title="Styling hCards with CSS"&gt;John Allsop&amp;#8217;s guide&lt;/a&gt; from 24 ways 2006.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;.vcard p {
	margin: 0;
}
.adr {
	margin-bottom: 0.5em;
}&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;To plot the restaurants on a map we&amp;#8217;ll need latitude and longitude for each one. We can find this out from their address using &lt;em&gt;geocoding&lt;/em&gt;. Most mapping &lt;span class="caps"&gt;API&lt;/span&gt;s include support for geocoding, which means we can pass the &lt;span class="caps"&gt;API&lt;/span&gt; an address and get back a latitude/longitude point. Mapstraction provides an abstraction layer around these &lt;span class="caps"&gt;API&lt;/span&gt;s which can be included using the following script tag:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;http://mapstraction.com/src/mapstraction-geocode.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;While we&amp;#8217;re at it, let&amp;#8217;s pull in the other external scripts we&amp;#8217;ll be using:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;jquery-1.2.1.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script src=&amp;quot;http://maps.google.com/maps?file=api&amp;amp;v=2&amp;amp;key=YOUR_KEY&amp;quot; type=&amp;quot;text/javascript&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;http://mapstraction.com/src/mapstraction.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;http://mapstraction.com/src/mapstraction-geocode.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;That&amp;#8217;s everything set up: let&amp;#8217;s write some JavaScript!&lt;/p&gt;

&lt;p&gt;In jQuery, almost every operation starts with a call to the jQuery function. The function simulates &lt;a href="http://en.wikipedia.org/wiki/Method_overloading"&gt;method overloading&lt;/a&gt; to behave in different ways depending on the arguments passed to it. When writing unobtrusive JavaScript it&amp;#8217;s important to set up code to execute when the page has loaded to the point that the &lt;span class="caps"&gt;DOM&lt;/span&gt; is available to be manipulated. To do this with jQuery, pass a callback function to the jQuery function itself:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;jQuery(function() {
	// This code will be executed when the DOM is ready
});&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;Initialising the map&lt;/h3&gt;

&lt;p&gt;The first thing we need to do is initialise our map. Mapstraction needs a div with an explicit width, height and ID to show it where to put the map. Our document doesn&amp;#8217;t currently include this markup, but we can insert it with a single line of jQuery code:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;jQuery(function() {
	// First create a div to host the map
	var themap = jQuery(&amp;#039;&amp;lt;div id=&amp;quot;themap&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;#039;).css({
		&amp;#039;width&amp;#039;: &amp;#039;90%&amp;#039;,
		&amp;#039;height&amp;#039;: &amp;#039;400px&amp;#039;
	}).insertBefore(&amp;#039;ul.restaurants&amp;#039;);
});&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;While this is technically just a single line of JavaScript (with line-breaks added for readability) it&amp;#8217;s actually doing quite a lot of work. Let&amp;#8217;s break it down in to steps:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;var themap = jQuery(&amp;#039;&amp;lt;div id=&amp;quot;themap&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;#039;)&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Here&amp;#8217;s jQuery&amp;#8217;s method overloading in action: if you pass it a string that starts with a &lt;code&gt;&amp;lt;&lt;/code&gt; it assumes that you wish to create a new &lt;span class="caps"&gt;HTML&lt;/span&gt; element. This provides us with a handy shortcut for the more verbose &lt;span class="caps"&gt;DOM&lt;/span&gt; equivalent:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;var themap = document.createElement(&amp;#039;div&amp;#039;);
themap.id = &amp;#039;themap&amp;#039;;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Next we want to apply some &lt;span class="caps"&gt;CSS&lt;/span&gt; rules to the element. jQuery supports chaining, which means we can continue to call methods on the object returned by jQuery or any of its methods:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;var themap = jQuery(&amp;#039;&amp;lt;div id=&amp;quot;themap&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;#039;).css({
	&amp;#039;width&amp;#039;: &amp;#039;90%&amp;#039;,
	&amp;#039;height&amp;#039;: &amp;#039;400px&amp;#039;
})&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Finally, we need to insert our new &lt;span class="caps"&gt;HTML&lt;/span&gt; element in to the page. jQuery provides a number of methods for element insertion, but in this case we want to position it directly before the &lt;code&gt;&amp;lt;ul&amp;gt;&lt;/code&gt; we are using to contain our restaurants. jQuery&amp;#8217;s &lt;code&gt;insertBefore()&lt;/code&gt; method takes a &lt;span class="caps"&gt;CSS&lt;/span&gt; selector indicating an element already on the page and places the current jQuery selection directly before that element in the &lt;span class="caps"&gt;DOM&lt;/span&gt;.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;var themap = jQuery(&amp;#039;&amp;lt;div id=&amp;quot;themap&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;#039;).css({
	&amp;#039;width&amp;#039;: &amp;#039;90%&amp;#039;,
	&amp;#039;height&amp;#039;: &amp;#039;400px&amp;#039;
}).insertBefore(&amp;#039;ul.restaurants&amp;#039;);&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Finally, we need to initialise the map itself using Mapstraction. The Mapstraction constructor takes two arguments: the first is the ID of the element used to position the map; the second is the mapping provider to use (in this case &lt;code&gt;google&lt;/code&gt; ):&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;// Initialise the map
var mapstraction = new Mapstraction(&amp;#039;themap&amp;#039;,&amp;#039;google&amp;#039;);&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;We want the map to appear centred on Brighton, so we&amp;#8217;ll need to know the correct co-ordinates. We can use &lt;a href="http://www.getlatlon.com/"&gt;www.getlatlon.com&lt;/a&gt; to find both the co-ordinates and the initial map zoom level.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;// Show map centred on Brighton
mapstraction.setCenterAndZoom(
	new LatLonPoint(50.82423734980143, -0.14007568359375),
	15 // Zoom level appropriate for Brighton city centre
);&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;We also want controls on the map to allow the user to zoom in and out and toggle between map and satellite view.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;mapstraction.addControls({
	zoom: &amp;#039;large&amp;#039;,
	map_type: true
});&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;Adding the markers&lt;/h3&gt;

&lt;p&gt;It&amp;#8217;s finally time to parse some microformats. Since we&amp;#8217;re using hCard, the information we want is wrapped in elements with the class &lt;code&gt;vcard&lt;/code&gt;. We can use jQuery&amp;#8217;s &lt;span class="caps"&gt;CSS&lt;/span&gt; selector support to find them:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;var vcards = jQuery(&amp;#039;.vcard&amp;#039;);&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Now that we&amp;#8217;ve found them, we need to create a marker for each one in turn. Rather than using a regular JavaScript for loop, we can instead use jQuery&amp;#8217;s &lt;code&gt;each()&lt;/code&gt; method to execute a function against each of the hCards.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;jQuery(&amp;#039;.vcard&amp;#039;).each(function() {
	// Do something with the hCard
});&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Within the callback function, &lt;code&gt;this&lt;/code&gt; is set to the current &lt;span class="caps"&gt;DOM&lt;/span&gt; element (in our case, the list item). If we want to call the magic jQuery methods on it we&amp;#8217;ll need to wrap it in another call to jQuery:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;jQuery(&amp;#039;.vcard&amp;#039;).each(function() {
	var hcard = jQuery(this);
});&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The Google maps geocoder seems to work best if you pass it the street address and a postcode. We can extract these using &lt;span class="caps"&gt;CSS&lt;/span&gt; selectors: this time, we&amp;#8217;ll use jQuery&amp;#8217;s &lt;code&gt;find()&lt;/code&gt; method which searches within the current jQuery selection:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;var streetaddress = hcard.find(&amp;#039;.street-address&amp;#039;).text();
var postcode = hcard.find(&amp;#039;.postal-code&amp;#039;).text();&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The &lt;code&gt;text()&lt;/code&gt; method extracts the text contents of the selected node, minus any &lt;span class="caps"&gt;HTML&lt;/span&gt; markup.&lt;/p&gt;

&lt;p&gt;We&amp;#8217;ve got the address; now we need to geocode it. Mapstraction&amp;#8217;s geocoding &lt;span class="caps"&gt;API&lt;/span&gt; requires us to first construct a &lt;code&gt;MapstractionGeocoder&lt;/code&gt;, then use the &lt;code&gt;geocode()&lt;/code&gt; method to pass it an address. Here&amp;#8217;s the code outline:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;var geocoder = new MapstractionGeocoder(onComplete, &amp;#039;google&amp;#039;);
geocoder.geocode({&amp;#039;address&amp;#039;: &amp;#039;the address goes here&amp;#039;);&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The &lt;code&gt;onComplete&lt;/code&gt; function is executed when the geocoding operation has been completed, and will be passed an object with the resulting point on the map. We just want to create a marker for the point:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;var geocoder = new MapstractionGeocoder(function(result) {
	var marker = new Marker(result.point);
	mapstraction.addMarker(marker);
}, &amp;#039;google&amp;#039;);   &lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;For our purposes, joining the street address and postcode with a comma to create the address should suffice:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;geocoder.geocode({&amp;#039;address&amp;#039;: streetaddress + &amp;#039;, &amp;#039; + postcode});   &lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;There&amp;#8217;s one last step: when the marker is clicked, we want to display details of the restaurant. We can do this with an info bubble, which can be configured by passing in a string of &lt;span class="caps"&gt;HTML&lt;/span&gt;. We&amp;#8217;ll construct that &lt;span class="caps"&gt;HTML&lt;/span&gt; using jQuery&amp;#8217;s &lt;code&gt;html()&lt;/code&gt; method on our &lt;code&gt;hcard&lt;/code&gt; object, which extracts the &lt;span class="caps"&gt;HTML&lt;/span&gt; contained within that &lt;span class="caps"&gt;DOM&lt;/span&gt; node as a string.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;var marker = new Marker(result.point);
marker.setInfoBubble(
	&amp;#039;&amp;lt;div class=&amp;quot;bubble&amp;quot;&amp;gt;&amp;#039; + hcard.html() + &amp;#039;&amp;lt;/div&amp;gt;&amp;#039;
);
mapstraction.addMarker(marker);&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;We&amp;#8217;ve wrapped the bubble in a div with class &lt;code&gt;bubble&lt;/code&gt; to make it easier to style. Google Maps can behave strangely if you don&amp;#8217;t provide an explicit width for your info bubbles, so we&amp;#8217;ll add that to our &lt;span class="caps"&gt;CSS&lt;/span&gt; now:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;.bubble {
	width: 300px;
}&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;That&amp;#8217;s everything we need: let&amp;#8217;s combine our code together:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;jQuery(function() {
	// First create a div to host the map
	var themap = jQuery(&amp;#039;&amp;lt;div id=&amp;quot;themap&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;#039;).css({
		&amp;#039;width&amp;#039;: &amp;#039;90%&amp;#039;,
		&amp;#039;height&amp;#039;: &amp;#039;400px&amp;#039;
	}).insertBefore(&amp;#039;ul.restaurants&amp;#039;);
	// Now initialise the map
	var mapstraction = new Mapstraction(&amp;#039;themap&amp;#039;,&amp;#039;google&amp;#039;);
	mapstraction.addControls({
		zoom: &amp;#039;large&amp;#039;,
		map_type: true
	});
	// Show map centred on Brighton
	mapstraction.setCenterAndZoom(
		new LatLonPoint(50.82423734980143, -0.14007568359375),
		15 // Zoom level appropriate for Brighton city centre
	);
	// Geocode each hcard and add a marker
	jQuery(&amp;#039;.vcard&amp;#039;).each(function() {
		var hcard = jQuery(this);
		var streetaddress = hcard.find(&amp;#039;.street-address&amp;#039;).text();
		var postcode = hcard.find(&amp;#039;.postal-code&amp;#039;).text();
		var geocoder = new MapstractionGeocoder(function(result) {
			var marker = new Marker(result.point);
			marker.setInfoBubble(
				&amp;#039;&amp;lt;div class=&amp;quot;bubble&amp;quot;&amp;gt;&amp;#039; + hcard.html() + &amp;#039;&amp;lt;/div&amp;gt;&amp;#039;
			);
			mapstraction.addMarker(marker);
		}, &amp;#039;google&amp;#039;);	 
		geocoder.geocode({&amp;#039;address&amp;#039;: streetaddress + &amp;#039;, &amp;#039; + postcode});
	});
});&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Here&amp;#8217;s the &lt;a href="https://24ways.org/examples/unobtrusively-mapping-microformats-with-jquery/restaurants.html"&gt;finished code&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;There&amp;#8217;s one last shortcut we can add: jQuery provides the &lt;code&gt;$&lt;/code&gt; symbol as an alias for jQuery. We could just go through our code and replace every call to &lt;code&gt;jQuery()&lt;/code&gt; with a call to &lt;code&gt;$()&lt;/code&gt;, but this would cause incompatibilities if we ever attempted to use our script on a page that also includes the Prototype library. A more robust approach is to start our code with the following:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;jQuery(function($) {
	// Within this function, $ now refers to jQuery
	// ...
});&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;jQuery cleverly passes itself as the first argument to any function registered to the &lt;span class="caps"&gt;DOM&lt;/span&gt; ready event, which means we can assign a local &lt;code&gt;$&lt;/code&gt; variable shortcut without affecting the &lt;code&gt;$&lt;/code&gt; symbol in the global scope. This makes it easy to &lt;a href="http://docs.jquery.com/Using_jQuery_with_Other_Libraries"&gt;use jQuery with other libraries&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;Limitations of Geocoding&lt;/h3&gt;

&lt;p&gt;You may have noticed a discrepancy creep in to the last example: whereas my original list included seven restaurants, the geocoding example only shows five. This is because the Google Maps geocoder incorporates a rate limit: more than five lookups in a second and it starts returning error messages instead of regular results.&lt;/p&gt;

&lt;p&gt;In addition to this problem, geocoding itself is an inexact science: while UK postcodes generally get you down to the correct street, figuring out the exact point on the street from the provided address usually isn&amp;#8217;t too accurate (although Google do a pretty good job).&lt;/p&gt;

&lt;p&gt;Finally, there&amp;#8217;s the performance overhead. We&amp;#8217;re making five geocoding requests to Google for every page served, even though the restaurants themselves aren&amp;#8217;t likely to change location any time soon. Surely there&amp;#8217;s a better way of doing this?&lt;/p&gt;

&lt;p&gt;Microformats to the rescue (again)! The &lt;a href="http://microformats.org/wiki/geo"&gt;geo microformat&lt;/a&gt; suggests simple classes for including latitude and longitude information in a page. We can add specific points for each restaurant using the following markup:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;li class=&amp;quot;vcard&amp;quot;&amp;gt;
	&amp;lt;h3 class=&amp;quot;fn org&amp;quot;&amp;gt;E-Kagen&amp;lt;/h3&amp;gt;
	&amp;lt;div class=&amp;quot;adr&amp;quot;&amp;gt;
		&amp;lt;p class=&amp;quot;street-address&amp;quot;&amp;gt;22-23 Sydney Street&amp;lt;/p&amp;gt;
		&amp;lt;p&amp;gt;&amp;lt;span class=&amp;quot;locality&amp;quot;&amp;gt;Brighton&amp;lt;/span&amp;gt;, &amp;lt;abbr class=&amp;quot;country-name&amp;quot; title=&amp;quot;United Kingdom&amp;quot;&amp;gt;UK&amp;lt;/abbr&amp;gt;&amp;lt;/p&amp;gt;
		&amp;lt;p class=&amp;quot;postal-code&amp;quot;&amp;gt;BN1 4EN&amp;lt;/p&amp;gt;
	&amp;lt;/div&amp;gt;
	&amp;lt;p&amp;gt;Telephone: &amp;lt;span class=&amp;quot;tel&amp;quot;&amp;gt;+44 (0)1273 687 068&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;
	&amp;lt;p class=&amp;quot;geo&amp;quot;&amp;gt;Lat/Lon: 
		&amp;lt;span class=&amp;quot;latitude&amp;quot;&amp;gt;50.827917&amp;lt;/span&amp;gt;, 
		&amp;lt;span class=&amp;quot;longitude&amp;quot;&amp;gt;-0.137764&amp;lt;/span&amp;gt;
	&amp;lt;/p&amp;gt;
&amp;lt;/li&amp;gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;As before, I used &lt;a href="http://www.getlatlon.com/"&gt;www.getlatlon.com&lt;/a&gt; to find the exact locations &amp;#8211; I find satellite view is particularly useful for locating individual buildings.&lt;/p&gt;

&lt;p&gt;Latitudes and longitudes are great for machines but not so useful for human beings. We could hide them entirely with &lt;code&gt;display: none&lt;/code&gt;, but I prefer to merely de-emphasise them (someone might want them for their &lt;span class="caps"&gt;GPS&lt;/span&gt; unit):&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;.vcard .geo {
	margin-top: 0.5em;
	font-size: 0.85em;
	color: #ccc;
}&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;It&amp;#8217;s probably a good idea to hide them completely when they&amp;#8217;re displayed inside an info bubble:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;.bubble .geo {
	display: none;
}&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;We can extract the co-ordinates in the same way we extracted the address. Since we&amp;#8217;re no longer geocoding anything our code becomes a lot simpler:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$(&amp;#039;.vcard&amp;#039;).each(function() {
	var hcard = $(this);
	var latitude = hcard.find(&amp;#039;.geo .latitude&amp;#039;).text();
	var longitude = hcard.find(&amp;#039;.geo .longitude&amp;#039;).text();
	var marker = new Marker(new LatLonPoint(latitude, longitude));
	marker.setInfoBubble(
		&amp;#039;&amp;lt;div class=&amp;quot;bubble&amp;quot;&amp;gt;&amp;#039; + hcard.html() + &amp;#039;&amp;lt;/div&amp;gt;&amp;#039;
	);
	mapstraction.addMarker(marker);
});&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;And here&amp;#8217;s the &lt;a href="https://24ways.org/examples/unobtrusively-mapping-microformats-with-jquery/restaurants-geo.html"&gt;finished geo example&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;Further reading&lt;/h3&gt;

&lt;p&gt;We&amp;#8217;ve only scratched the surface of what&amp;#8217;s possible with microformats, jQuery (or just regular JavaScript) and a bit of imagination. If this example has piqued your interest, the following links should give you some more food for thought.&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;&lt;a href="http://microformats.org/wiki/hcard"&gt;The hCard specification&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://microformats.org/wiki/hcard-parsing"&gt;Notes on parsing hCards&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://simonwillison.net/2007/Aug/15/jquery/"&gt;jQuery for JavaScript programmers&lt;/a&gt; &amp;#8211; my extended tutorial on jQuery.&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://www.danwebb.net/2007/2/9/sumo-a-generic-microformats-parser-for-javascript"&gt;Dann Webb&amp;#8217;s Sumo&lt;/a&gt; &amp;#8211; a full JavaScript library for parsing microformats, based around some clever metaprogramming techniques.&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://austin.adactio.com/"&gt;Jeremy Keith&amp;#8217;s Adactio Austin&lt;/a&gt; &amp;#8211; the first place I saw using microformats to unobtrusively plot locations on a map. Makes clever use of hEvent as well.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;This article &lt;a href="https://24ways.org/2007/unobtrusively-mapping-microformats-with-jquery/"&gt;originally appeared on 24ways&lt;/a&gt;&lt;/em&gt;.&lt;/p&gt;
    
        &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/24-ways"&gt;24-ways&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/brighton"&gt;brighton&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/jquery"&gt;jquery&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/mapping"&gt;mapping&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/microformats"&gt;microformats&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/unobtrusive-javascript"&gt;unobtrusive-javascript&lt;/a&gt;&lt;/p&gt;
    

</summary><category term="24-ways"/><category term="brighton"/><category term="jquery"/><category term="mapping"/><category term="microformats"/><category term="unobtrusive-javascript"/></entry><entry><title>Unobtrusively Mapping Microformats with jQuery</title><link href="https://simonwillison.net/2007/Dec/12/microformats/#atom-tag" rel="alternate"/><published>2007-12-12T00:28:40+00:00</published><updated>2007-12-12T00:28:40+00:00</updated><id>https://simonwillison.net/2007/Dec/12/microformats/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://24ways.org/2007/unobtrusively-mapping-microformats-with-jquery"&gt;Unobtrusively Mapping Microformats with jQuery&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
My contribution to 24 ways: using Mapstraction to geocode hCards (extracted with jQuery) and plot them on a Google Map.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/24-ways"&gt;24-ways&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/geocoding"&gt;geocoding&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/google-maps"&gt;google-maps&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/hcard"&gt;hcard&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/javascript"&gt;javascript&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/jquery"&gt;jquery&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/mapstraction"&gt;mapstraction&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/microformats"&gt;microformats&lt;/a&gt;&lt;/p&gt;



</summary><category term="24-ways"/><category term="geocoding"/><category term="google-maps"/><category term="hcard"/><category term="javascript"/><category term="jquery"/><category term="mapstraction"/><category term="microformats"/></entry><entry><title>DiSo: Distributed Social Networking applications</title><link href="https://simonwillison.net/2007/Dec/6/diso/#atom-tag" rel="alternate"/><published>2007-12-06T17:48:05+00:00</published><updated>2007-12-06T17:48:05+00:00</updated><id>https://simonwillison.net/2007/Dec/6/diso/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://code.google.com/p/diso/"&gt;DiSo: Distributed Social Networking applications&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
New project to prototype a decentralised social network on top of WordPress, using OpenID, microformats and social whitelisting.

    &lt;p&gt;&lt;small&gt;&lt;/small&gt;Via &lt;a href="http://factoryjoe.com/blog/2007/12/06/oauth-10-openid-20-and-up-next-diso/"&gt;OAuth 1.0, OpenID 2.0 and up next: DiSo&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/diso"&gt;diso&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/microformats"&gt;microformats&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/openid"&gt;openid&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/prototyping"&gt;prototyping&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/social-whitelisting"&gt;social-whitelisting&lt;/a&gt;&lt;/p&gt;



</summary><category term="diso"/><category term="microformats"/><category term="openid"/><category term="prototyping"/><category term="social-whitelisting"/></entry><entry><title>Portable Social Networks: Take Your Friends with You</title><link href="https://simonwillison.net/2007/Nov/23/portable/#atom-tag" rel="alternate"/><published>2007-11-23T23:56:12+00:00</published><updated>2007-11-23T23:56:12+00:00</updated><id>https://simonwillison.net/2007/Nov/23/portable/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.sitepoint.com/article/social-networks-take-friends"&gt;Portable Social Networks: Take Your Friends with You&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Brian Suda explains how OpenID, XFN and hCard can be used together to bootstrap portable social networks.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/brian-suda"&gt;brian-suda&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/hcard"&gt;hcard&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/microformats"&gt;microformats&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/openid"&gt;openid&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/portablesocialnetworks"&gt;portablesocialnetworks&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/xfn"&gt;xfn&lt;/a&gt;&lt;/p&gt;



</summary><category term="brian-suda"/><category term="hcard"/><category term="microformats"/><category term="openid"/><category term="portablesocialnetworks"/><category term="xfn"/></entry><entry><title>identity-matcher</title><link href="https://simonwillison.net/2007/Oct/4/identitymatcher/#atom-tag" rel="alternate"/><published>2007-10-04T14:53:12+00:00</published><updated>2007-10-04T14:53:12+00:00</updated><id>https://simonwillison.net/2007/Oct/4/identitymatcher/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://code.google.com/p/identity-matcher/"&gt;identity-matcher&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Dopplr’s social network importing code (for Gmail, Twitter, Facebook and sites supporting Microformats), implemented as a Rails ActiveRecord plugin.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/dopplr"&gt;dopplr&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/facebook"&gt;facebook&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/fowa"&gt;fowa&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/fowa2007"&gt;fowa2007&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/gmail"&gt;gmail&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/identitymatcher"&gt;identitymatcher&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/matt-biddulph"&gt;matt-biddulph&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/microformats"&gt;microformats&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/openid"&gt;openid&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/plugins"&gt;plugins&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/portablesocialnetwork"&gt;portablesocialnetwork&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/rails"&gt;rails&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ruby"&gt;ruby&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/social-graph"&gt;social-graph&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/twitter"&gt;twitter&lt;/a&gt;&lt;/p&gt;



</summary><category term="dopplr"/><category term="facebook"/><category term="fowa"/><category term="fowa2007"/><category term="gmail"/><category term="identitymatcher"/><category term="matt-biddulph"/><category term="microformats"/><category term="openid"/><category term="plugins"/><category term="portablesocialnetwork"/><category term="rails"/><category term="ruby"/><category term="social-graph"/><category term="twitter"/></entry><entry><title>lxml.cssselect</title><link href="https://simonwillison.net/2007/Sep/24/lxmlcssselect/#atom-tag" rel="alternate"/><published>2007-09-24T23:57:17+00:00</published><updated>2007-09-24T23:57:17+00:00</updated><id>https://simonwillison.net/2007/Sep/24/lxmlcssselect/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://codespeak.net/lxml/dev/cssselect.html"&gt;lxml.cssselect&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
lxml includes an implementation of CSS 3 selectors, which compiles them to XPath expressions. Should be a useful tool for parsing Microformats from Python.

    &lt;p&gt;&lt;small&gt;&lt;/small&gt;Via &lt;a href="http://blog.ianbicking.org/2007/09/24/lxmlhtml/"&gt;Ian Bicking&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/css"&gt;css&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/css3"&gt;css3&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/libxml2"&gt;libxml2&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/lxml"&gt;lxml&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/microformats"&gt;microformats&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/python"&gt;python&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/selectors"&gt;selectors&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/xpath"&gt;xpath&lt;/a&gt;&lt;/p&gt;



</summary><category term="css"/><category term="css3"/><category term="libxml2"/><category term="lxml"/><category term="microformats"/><category term="python"/><category term="selectors"/><category term="xpath"/></entry><entry><title>Satisfaction signup page</title><link href="https://simonwillison.net/2007/Sep/18/satisfaction/#atom-tag" rel="alternate"/><published>2007-09-18T11:25:45+00:00</published><updated>2007-09-18T11:25:45+00:00</updated><id>https://simonwillison.net/2007/Sep/18/satisfaction/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://getsatisfaction.com/people/new"&gt;Satisfaction signup page&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Check out the box on the right: it lets you use hCard to instantly import your public profile data (including a user icon) from Flickr, Twitter, Upcoming and more.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/hcard"&gt;hcard&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/microformats"&gt;microformats&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/portablesocialnetworks"&gt;portablesocialnetworks&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/satisfaction"&gt;satisfaction&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/signup"&gt;signup&lt;/a&gt;&lt;/p&gt;



</summary><category term="hcard"/><category term="microformats"/><category term="portablesocialnetworks"/><category term="satisfaction"/><category term="signup"/></entry><entry><title>Microformats in Google Maps</title><link href="https://simonwillison.net/2007/Jul/31/official/#atom-tag" rel="alternate"/><published>2007-07-31T23:36:17+00:00</published><updated>2007-07-31T23:36:17+00:00</updated><id>https://simonwillison.net/2007/Jul/31/official/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://googlemapsapi.blogspot.com/2007/06/microformats-in-google-maps.html"&gt;Microformats in Google Maps&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
No doubt thanks to the influence of Kevin Marks.

    &lt;p&gt;&lt;small&gt;&lt;/small&gt;Via &lt;a href="http://adactio.com/journal/1325"&gt;Jeremy Keith&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/google"&gt;google&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/google-maps"&gt;google-maps&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/jeremy-keith"&gt;jeremy-keith&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/kevin-marks"&gt;kevin-marks&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/microformats"&gt;microformats&lt;/a&gt;&lt;/p&gt;



</summary><category term="google"/><category term="google-maps"/><category term="jeremy-keith"/><category term="kevin-marks"/><category term="microformats"/></entry><entry><title>Quoting IE Team Job Ad</title><link href="https://simonwillison.net/2007/Jul/18/job/#atom-tag" rel="alternate"/><published>2007-07-18T07:43:48+00:00</published><updated>2007-07-18T07:43:48+00:00</updated><id>https://simonwillison.net/2007/Jul/18/job/#atom-tag</id><summary type="html">
    &lt;blockquote cite="http://members.microsoft.com/careers/search/details.aspx?JobID=D210C5AE-47C8-48F2-AADA-D3D35549C1CA"&gt;&lt;p&gt;Does the idea of redefining the role of the Internet browser appeal to you? Do the terms HTTP, RSS, Microformats, and OpenID, excite you? If so, then this just might be the opportunity for you.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p class="cite"&gt;&amp;mdash; &lt;a href="http://members.microsoft.com/careers/search/details.aspx?JobID=D210C5AE-47C8-48F2-AADA-D3D35549C1CA"&gt;IE Team Job Ad&lt;/a&gt;&lt;/p&gt;

    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/http"&gt;http&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/internet-explorer"&gt;internet-explorer&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/microformats"&gt;microformats&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/microsoft"&gt;microsoft&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/openid"&gt;openid&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/rss"&gt;rss&lt;/a&gt;&lt;/p&gt;



</summary><category term="http"/><category term="internet-explorer"/><category term="microformats"/><category term="microsoft"/><category term="openid"/><category term="rss"/></entry><entry><title>Importing your social network from other sites</title><link href="https://simonwillison.net/2007/Jun/26/dopplr/#atom-tag" rel="alternate"/><published>2007-06-26T01:46:09+00:00</published><updated>2007-06-26T01:46:09+00:00</updated><id>https://simonwillison.net/2007/Jun/26/dopplr/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://blog.dopplr.com/index.php/2007/06/23/importing-your-social-network-from-other-sites/"&gt;Importing your social network from other sites&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Dopplr now does this from GMail, Twitter, vCard or hCard and XFN. I’m convinced that contact import is a killer app for OpenID.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/contactimport"&gt;contactimport&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/dopplr"&gt;dopplr&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/gmail"&gt;gmail&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/hcard"&gt;hcard&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/microformats"&gt;microformats&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/openid"&gt;openid&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/twitter"&gt;twitter&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/vcard"&gt;vcard&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/xfn"&gt;xfn&lt;/a&gt;&lt;/p&gt;



</summary><category term="contactimport"/><category term="dopplr"/><category term="gmail"/><category term="hcard"/><category term="microformats"/><category term="openid"/><category term="twitter"/><category term="vcard"/><category term="xfn"/></entry><entry><title>hAccessibility</title><link href="https://simonwillison.net/2007/Apr/27/haccessibility/#atom-tag" rel="alternate"/><published>2007-04-27T13:07:59+00:00</published><updated>2007-04-27T13:07:59+00:00</updated><id>https://simonwillison.net/2007/Apr/27/haccessibility/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.webstandards.org/2007/04/27/haccessibility/"&gt;hAccessibility&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
The use of the abbr element in hCalendar causes screen readers to read out an incomprehensible number instead of a date.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/accessibility"&gt;accessibility&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/hcalendar"&gt;hcalendar&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/microformats"&gt;microformats&lt;/a&gt;&lt;/p&gt;



</summary><category term="accessibility"/><category term="hcalendar"/><category term="microformats"/></entry><entry><title>Triplr</title><link href="https://simonwillison.net/2007/Mar/30/triplr/#atom-tag" rel="alternate"/><published>2007-03-30T15:30:15+00:00</published><updated>2007-03-30T15:30:15+00:00</updated><id>https://simonwillison.net/2007/Mar/30/triplr/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://triplr.org/"&gt;Triplr&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Ultra simple GET-based web service for converting RSS / Atom / RDF / Microformats+GRDDL to HTML / ntriples / RDF / RSS / JSON / Turtle. Small pieces, loosely joined.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/atom"&gt;atom&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/grddl"&gt;grddl&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/html"&gt;html&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/json"&gt;json&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/microformats"&gt;microformats&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ntriples"&gt;ntriples&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/rdf"&gt;rdf&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/rss"&gt;rss&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/semanticweb"&gt;semanticweb&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/triplr"&gt;triplr&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/turtle"&gt;turtle&lt;/a&gt;&lt;/p&gt;



</summary><category term="atom"/><category term="grddl"/><category term="html"/><category term="json"/><category term="microformats"/><category term="ntriples"/><category term="rdf"/><category term="rss"/><category term="semanticweb"/><category term="triplr"/><category term="turtle"/></entry><entry><title>soupselect</title><link href="https://simonwillison.net/2007/Feb/28/soupselect/#atom-tag" rel="alternate"/><published>2007-02-28T13:47:14+00:00</published><updated>2007-02-28T13:47:14+00:00</updated><id>https://simonwillison.net/2007/Feb/28/soupselect/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://code.google.com/p/soupselect/"&gt;soupselect&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
My simple extension to BeautifulSoup that allows you to grab elements using CSS selectors; should be useful for parsing microformats.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/beautifulsoup"&gt;beautifulsoup&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/css"&gt;css&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/microformats"&gt;microformats&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/python"&gt;python&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/soupselect"&gt;soupselect&lt;/a&gt;&lt;/p&gt;



</summary><category term="beautifulsoup"/><category term="css"/><category term="microformats"/><category term="python"/><category term="soupselect"/></entry><entry><title>Microformats Bookmarklet</title><link href="https://simonwillison.net/2007/Feb/27/microformats/#atom-tag" rel="alternate"/><published>2007-02-27T23:43:26+00:00</published><updated>2007-02-27T23:43:26+00:00</updated><id>https://simonwillison.net/2007/Feb/27/microformats/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://leftlogic.com/info/articles/microformats_bookmarklet"&gt;Microformats Bookmarklet&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Microformats bookmarklet, targetted at Safari. Uses jQuery CSS selectors for parsing, and generates .vcf vCard files using data: uris.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/bookmarklets"&gt;bookmarklets&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/datauris"&gt;datauris&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/jquery"&gt;jquery&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/microformats"&gt;microformats&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/safari"&gt;safari&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/vcard"&gt;vcard&lt;/a&gt;&lt;/p&gt;



</summary><category term="bookmarklets"/><category term="datauris"/><category term="jquery"/><category term="microformats"/><category term="safari"/><category term="vcard"/></entry><entry><title>OpenID and microformats support on XTech site</title><link href="https://simonwillison.net/2007/Feb/27/xtech/#atom-tag" rel="alternate"/><published>2007-02-27T12:46:25+00:00</published><updated>2007-02-27T12:46:25+00:00</updated><id>https://simonwillison.net/2007/Feb/27/xtech/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://times.usefulinc.com/2007/02/27-openid-uformats"&gt;OpenID and microformats support on XTech site&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
“A single-sign on solution like OpenID solves an important problem for us, as most people tend to interact with our conference web sites in only one or two time periods each year.”


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/microformats"&gt;microformats&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/openid"&gt;openid&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/xtech"&gt;xtech&lt;/a&gt;&lt;/p&gt;



</summary><category term="microformats"/><category term="openid"/><category term="xtech"/></entry><entry><title>Tutorials on Microformats</title><link href="https://simonwillison.net/2007/Feb/14/tutorials/#atom-tag" rel="alternate"/><published>2007-02-14T16:45:32+00:00</published><updated>2007-02-14T16:45:32+00:00</updated><id>https://simonwillison.net/2007/Feb/14/tutorials/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.xfront.com/microformats/"&gt;Tutorials on Microformats&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Roger Costello’s 11 tutorials on microformats, covering hCard, hCalendar, hReview and more.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/microformats"&gt;microformats&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/tutorial"&gt;tutorial&lt;/a&gt;&lt;/p&gt;



</summary><category term="microformats"/><category term="tutorial"/></entry><entry><title>Sumo! A Generic Microformats Parser For JavaScript</title><link href="https://simonwillison.net/2007/Feb/9/sumo/#atom-tag" rel="alternate"/><published>2007-02-09T10:57:20+00:00</published><updated>2007-02-09T10:57:20+00:00</updated><id>https://simonwillison.net/2007/Feb/9/sumo/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.danwebb.net/2007/2/9/sumo-a-generic-microformats-parser-for-javascript"&gt;Sumo! A Generic Microformats Parser For JavaScript&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Dan Webb’s BarCamp talk on Metaprogramming JavaScript will be a must-see.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/barcamp"&gt;barcamp&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/dan-webb"&gt;dan-webb&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/javascript"&gt;javascript&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/microformats"&gt;microformats&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/sumo"&gt;sumo&lt;/a&gt;&lt;/p&gt;



</summary><category term="barcamp"/><category term="dan-webb"/><category term="javascript"/><category term="microformats"/><category term="sumo"/></entry><entry><title>A Semantic Solution for Presenting NSFW Content</title><link href="https://simonwillison.net/2007/Jan/9/nsfw/#atom-tag" rel="alternate"/><published>2007-01-09T11:45:08+00:00</published><updated>2007-01-09T11:45:08+00:00</updated><id>https://simonwillison.net/2007/Jan/9/nsfw/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://pj.doland.org/archives/041577.php"&gt;A Semantic Solution for Presenting NSFW Content&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
It’s basically a NSFW microformat.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/microformats"&gt;microformats&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/nsfw"&gt;nsfw&lt;/a&gt;&lt;/p&gt;



</summary><category term="microformats"/><category term="nsfw"/></entry><entry><title>Introducing Operator</title><link href="https://simonwillison.net/2006/Dec/18/operator/#atom-tag" rel="alternate"/><published>2006-12-18T16:36:37+00:00</published><updated>2006-12-18T16:36:37+00:00</updated><id>https://simonwillison.net/2006/Dec/18/operator/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://labs.mozilla.com/2006/12/introducing-operator/"&gt;Introducing Operator&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
New microformat detecting Firefox extension, developed at IBM and released by Mozilla Labs. Examples are from Yahoo! Local, Upcoming and Flickr.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/extension"&gt;extension&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/firefox"&gt;firefox&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/flickr"&gt;flickr&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ibm"&gt;ibm&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/microformats"&gt;microformats&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/mozilla"&gt;mozilla&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/mozillalabs"&gt;mozillalabs&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/upcoming"&gt;upcoming&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/yahoo"&gt;yahoo&lt;/a&gt;&lt;/p&gt;



</summary><category term="extension"/><category term="firefox"/><category term="flickr"/><category term="ibm"/><category term="microformats"/><category term="mozilla"/><category term="mozillalabs"/><category term="upcoming"/><category term="yahoo"/></entry><entry><title>MagicLine</title><link href="https://simonwillison.net/2005/Aug/4/magicline/#atom-tag" rel="alternate"/><published>2005-08-04T16:32:40+00:00</published><updated>2005-08-04T16:32:40+00:00</updated><id>https://simonwillison.net/2005/Aug/4/magicline/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.mozdev.org/pipermail/greasemonkey/2005-August/004738.html"&gt;MagicLine&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Greasemonkey + microformats killer app. You just HAVE to check this out.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/greasemonkey"&gt;greasemonkey&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/microformats"&gt;microformats&lt;/a&gt;&lt;/p&gt;



</summary><category term="greasemonkey"/><category term="microformats"/></entry></feed>