One reason is that JSON doesn't cleanly map to s-expressions. You can fake it with an arbitrary attribute, but there isn't a 1:1 mapping.
The biggest reason is that HTML was designed to mark up human-readable documents, rather than to describe machine-readable documents. You can remove all the markup from a web page and easily read its contents; you can't do the same with JSON.