Barcelona vs Madrid: which Spanish city will you choose?
Struggling to choose between Barcelona or Madrid? Our local writers can help you choose.

Spain's iconic rivals face off as two Lonely Planet writers go head-to-head defending their beloved home cities. Isabella champions Barcelona's Mediterranean beauty with golden beaches, while Natalia makes the case for Madrid's world-class art treasures and historic sites. Both are magnificent, and both have a distinct appeal. Which Spanish giant would you choose?
Bask in Barcelona’s Mediterranean beauty
Isabella Noble grew up in Andalucía in southern Spain and has been exploring Catalonia’s mesmerizing capital Barcelona since her teens. Now based between Barcelona and Málaga, she is the coordinating writer of the new Lonely Planet Barcelona, Pocket Barcelona and Spain guidebooks.
Anyone who loves Barcelona will tell you that the Catalan capital’s energy is uniquely enchanting, electric and inspiring all at once. And it will probably be over a chilled vermouth, a plate of crispy patates braves (spicy potatoes) and a few slices of pa amb tomàquet (tomato bread) to share on a sun-dappled plaça (plaza), because outdoor living is what this wonderful, Mediterranean-side city is all about.
First, there’s the unbeatable setting. Sorry Madrid, there’s no contest here: Barcelona is a beach-loving beauty bathed by the Mediterranean breeze. A perfect way to get a feel for what makes the city tick is by heading down to the seafront around the golden Poblenou beaches. For years this pocket of coastal joy has been my favorite spot for exhilarating running routes and switch-off beach time with sparkling city views. You’ll always find a local crowd out walking, cycling, jogging, rollerblading, swimming or paddleboarding here, or lingering over lunch at one of the sea-view restaurants.
There’s no tiptoeing around Barcelona’s other headlining stars, of course. Its stash of Modernista architecture is genuinely unmatched, and there’s much more to discover beyond the most famous wonders created by the great Antoni Gaudí. You should absolutely experience top-tier Gaudí sights like Casa Batlló, with its shimmering tile-studded walls that feel almost like rolling waves; La Pedrera, whose spectacular rooftop bursts with chimney pots designed to look like medieval knights; and La Sagrada Família, a seriously breathtaking living monument that might finally be completed in 2026. Meanwhile, Barcelona’s old historic center – the Barri Gòtic – is a medieval fantasy with still-visible Roman roots, hushed shady squares and an unmissable spire-topped cathedral.
Whenever you’re here, don’t miss the lesser-known Modernista jewels, like Gaudí’s Casa Vicens (a marigold-tiled masterpiece hidden away on a Gràcia backstreet), the Recinte Modernista de Sant Pau (a garden-style hospital created by Lluís Domènech i Montaner) or the Pavellons Güell, where a wrought-iron Gaudí-designed dragon roars from a monumental gateway in the quiet Pedralbes district. Better yet, uncover Barcelona’s Modernisme scene on an expert-guided, off-the-beaten-track tour with Barcelona Architecture Walks or Barcelona Design Tours. Exception: The parser function of type "canto_diptych" is not defined. Define your custom parser functions as: https://github.com/shuqikhor/editorjs-html-php#extend-for-custom-blocks in /code/vendor/sqkhor/editorjs-html/src/edjsHTML.php:70 Stack trace: #0 /code/vendor/sqkhor/editorjs-html/src/edjsHTML.php(17): edjsHTML::parse_function_error('canto_diptych') #1 [internal function]: edjsHTML::parse_block(Array) #2 /code/web/modules/custom/editorjs_custom_plugins/src/Parser/CustomParser.php(28): array_map(Array, Array) #3 /code/web/modules/custom/aws_event_pipeline/src/Mappers/v1/ArticleMapper.php(123): Drupal\editorjs_custom_plugins\Parser\CustomParser::parse(Array) #4 /code/web/modules/custom/aws_event_pipeline/src/AwsFormatter.php(168): Drupal\aws_event_pipeline\Mappers\v1\ArticleMapper->toAwsPayload(Object(Drupal\node\Entity\Node)) #5 /code/web/modules/custom/aws_event_pipeline/src/AwsFormatter.php(151): Drupal\aws_event_pipeline\AwsFormatter->getPayload(Object(Drupal\node\Entity\Node), Array) #6 /code/web/modules/custom/aws_event_pipeline/src/AwsEventSync.php(174): Drupal\aws_event_pipeline\AwsFormatter->getAwsMessage(Object(Drupal\node\Entity\Node), Object(Drupal\aws_event_pipeline\AwsEvent\AwsEvent), Array) #7 /code/web/modules/custom/aws_event_pipeline/src/Plugin/QueueWorker/AepQueueProcessor.php(177): Drupal\aws_event_pipeline\AwsEventSync->sendToAws(Object(Drupal\node\Entity\Node), Object(Drupal\aws_event_pipeline\AwsEvent\AwsEvent)) #8 /code/web/modules/contrib/ultimate_cron/src/QueueWorker.php(111): Drupal\aws_event_pipeline\Plugin\QueueWorker\AepQueueProcessor->processItem(Object(Drupal\aws_event_pipeline\AwsEvent\AwsEvent)) #9 [internal function]: Drupal\ultimate_cron\QueueWorker->queueCallback(Object(Drupal\ultimate_cron\Entity\CronJob)) #10 /code/web/modules/contrib/ultimate_cron/src/Entity/CronJob.php(325): call_user_func(Array, Object(Drupal\ultimate_cron\Entity\CronJob)) #11 /code/web/modules/contrib/ultimate_cron/src/Entity/CronJob.php(471): Drupal\ultimate_cron\Entity\CronJob->invokeCallback() #12 /code/web/modules/contrib/ultimate_cron/src/Plugin/ultimate_cron/Launcher/SerialLauncher.php(213): Drupal\ultimate_cron\Entity\CronJob->run(Object(Drupal\Core\StringTranslation\TranslatableMarkup)) #13 /code/web/modules/contrib/ultimate_cron/src/Plugin/ultimate_cron/Launcher/SerialLauncher.php(334): Drupal\ultimate_cron\Plugin\ultimate_cron\Launcher\SerialLauncher->launch(Object(Drupal\ultimate_cron\Entity\CronJob)) #14 /code/web/modules/contrib/ultimate_cron/src/Plugin/ultimate_cron/Launcher/SerialLauncher.php(309): Drupal\ultimate_cron\Plugin\ultimate_cron\Launcher\SerialLauncher->runThread('6145728', 1, Array) #15 /code/web/modules/contrib/ultimate_cron/src/UltimateCron.php(64): Drupal\ultimate_cron\Plugin\ultimate_cron\Launcher\SerialLauncher->launchJobs(Array) #16 /code/web/modules/contrib/ultimate_cron/src/ProxyClass/UltimateCron.php(70): Drupal\ultimate_cron\UltimateCron->run() #17 /code/web/core/modules/system/src/CronController.php(46): Drupal\ultimate_cron\ProxyClass\UltimateCron->run() #18 [internal function]: Drupal\system\CronController->run() #19 /code/web/core/lib/Drupal/Core/EventSubscriber/EarlyRenderingControllerWrapperSubscriber.php(123): call_user_func_array(Array, Array) #20 /code/web/core/lib/Drupal/Core/Render/Renderer.php(592): Drupal\Core\EventSubscriber\EarlyRenderingControllerWrapperSubscriber->Drupal\Core\EventSubscriber\{closure}() #21 /code/web/core/lib/Drupal/Core/EventSubscriber/EarlyRenderingControllerWrapperSubscriber.php(124): Drupal\Core\Render\Renderer->executeInRenderContext(Object(Drupal\Core\Render\RenderContext), Object(Closure)) #22 /code/web/core/lib/Drupal/Core/EventSubscriber/EarlyRenderingControllerWrapperSubscriber.php(97): Drupal\Core\EventSubscriber\EarlyRenderingControllerWrapperSubscriber->wrapControllerExecutionInRenderContext(Array, Array) #23 /code/vendor/symfony/http-kernel/HttpKernel.php(181): Drupal\Core\EventSubscriber\EarlyRenderingControllerWrapperSubscriber->Drupal\Core\EventSubscriber\{closure}() #24 /code/vendor/symfony/http-kernel/HttpKernel.php(76): Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object(Symfony\Component\HttpFoundation\Request), 1) #25 /code/web/modules/contrib/redirect_after_login/src/RedirectMiddleware.php(44): Symfony\Component\HttpKernel\HttpKernel->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true) #26 /code/web/core/lib/Drupal/Core/StackMiddleware/Session.php(58): Drupal\redirect_after_login\RedirectMiddleware->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true) #27 /code/web/core/lib/Drupal/Core/StackMiddleware/KernelPreHandle.php(48): Drupal\Core\StackMiddleware\Session->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true) #28 /code/web/core/modules/page_cache/src/StackMiddleware/PageCache.php(191): Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true) #29 /code/web/core/modules/page_cache/src/StackMiddleware/PageCache.php(128): Drupal\page_cache\StackMiddleware\PageCache->fetch(Object(Symfony\Component\HttpFoundation\Request), 1, true) #30 /code/web/core/modules/page_cache/src/StackMiddleware/PageCache.php(82): Drupal\page_cache\StackMiddleware\PageCache->lookup(Object(Symfony\Component\HttpFoundation\Request), 1, true) #31 /code/vendor/asm89/stack-cors/src/Cors.php(53): Drupal\page_cache\StackMiddleware\PageCache->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true) #32 /code/web/core/lib/Drupal/Core/StackMiddleware/ReverseProxyMiddleware.php(48): Asm89\Stack\Cors->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true) #33 /code/web/core/lib/Drupal/Core/StackMiddleware/NegotiationMiddleware.php(51): Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true) #34 /code/web/core/lib/Drupal/Core/StackMiddleware/StackedHttpKernel.php(51): Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true) #35 /code/web/core/lib/Drupal/Core/DrupalKernel.php(704): Drupal\Core\StackMiddleware\StackedHttpKernel->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true) #36 /code/web/index.php(19): Drupal\Core\DrupalKernel->handle(Object(Symfony\Component\HttpFoundation\Request)) #37 {main}
Spain’s capital is rightly respected for its many superb galleries (who doesn’t love the Prado?), but Barcelona has a long history of creativity and easily holds its own among Europe’s great art cities. Start with the exquisite Fundació Joan Miró, whose sharp design plays with flowing city panoramas and floods of Mediterranean light. Then pop next-door to the Museu Nacional d’Art de Catalunya to wander past vivid Romanesque frescoes rescued from remote-Catalonia churches, or take in the curious collection of the Museu Picasso Barcelona, housed across several sensitively restored medieval mansions in El Born. Save time too for smaller, more offbeat galleries such as the Museu Can Framis, devoted to contemporary Catalan art over in the cool Poblenou neighbourhood. The city’s thriving crafts scene also goes back centuries and today lives on in small-scale shops and artisan studios specializing in everything from ceramics to basketry, especially around El Born, Barri Gòtic and Gràcia.
Indeed, much of Barcelona’s entrancing personality lies in its rich and distinctive cultural heritage, arguably best discovered by catching one of its many fabulous festivals. During events like the winter-time Festes de Santa Eulàlia or La Mercè in September, streets and squares all over the city morph into open-air stages where colorful gegants (papier-mache giants) dance, castellers scramble to create astonishing human towers and correfocs (fire-runs) light up the night with fireworks.
Barcelona’s wondrous food scene needs no introduction – it’s undoubtedly one of Europe’s finest. A strong Catalan culinary heritage shines everywhere from relaxed corner spots serving classic dishes such as escalivada (smoky grilled vegetables), to intensely creative, art-worthy cuisine at the likes of triple-Michelin-starred Disfrutar. Terrific markets dotted all over the city play a key role. Each barri (neighbourhood) has at least one market crammed with local olive oil, cheeses, fresh veg and other goodies; I often pop into Gràcia’s Mercat de la Llibertat (another Modernista delight) to pick up ingredients. Then there’s the thriving international-food scene – thanks to its multicultural community, Barcelona also has some of Spain’s most exciting global kitchens, from innovative sushi counters to tip-top taco bars. And I haven’t even mentioned the city’s prize-winning cocktail bars yet.
Madrid-lovers are also bound to rave about the deservedly beloved Parque del Buen Retiro, but Barcelona has its own on-the-doorstep green haven in the wilder Parc Natural de Collserola. This vast, protected expanse of pine-covered hills bursts with hiking trails and has rolling urban views to rival those of famous Park Güell, all particularly magical around sunset. Back in the city center, lovely Parc de la Ciutadella is the place for leisurely strolls under rustling palms.
So spend a few days getting to know Catalonia’s soul-stirring capital well beyond its most celebrated sights and it’s bound to pull you back for years, just like so many others. I’ll see you on that sunny square sometime.
Marvel at Madrid's historic and cultural sites
Lonely Planet writer Natalia Diaz is a co-author of the latest Lonely Planet Madrid guidebook. Read her Lonely Planet articles focused on food and practical travel tips around Spain here.
As someone with roots in Spain’s two famous rival cities (I have family in Barcelona but choose to live in Madrid), I often get asked which city is better. To this, I always say that Madrid and Barcelona are like two sisters with distinct personalities. One is notably more popular with an eye-catching style (hello, Gaudí masterpieces). The other is more understated, balancing classical elegance with contemporary energy, a capital city where social get-togethers continue past sunrise.
There's a local saying: "De Madrid al cielo, y en el cielo, un agujerito para verlo" – From Madrid to heaven, and from heaven, a little hole to see it – and it's a testament to the city's abundant cultural experiences. In Madrid, you’ll feel at home nibbling on tapas in a traditional tavern, meeting a friendly, albeit loquacious madrileño, and staying up late fueled by great food, sublime wine and good vibes. I’ve been living here for the past 17 years, and it still surprises me how much I still discover about Madrid.
Beyond the expected attractions like the city’s grand square, Plaza Mayor, and the 292-acre Parque del Buen Retiro (once the exclusive grounds of the Spanish aristocracy), Madrid hosts unexpected sites like Templo de Debod, an authentic 2200-year-old Egyptian temple in the center of the city that offers one of Madrid's most impressive sunset views.Exception: The parser function of type "canto_diptych" is not defined. Define your custom parser functions as: https://github.com/shuqikhor/editorjs-html-php#extend-for-custom-blocks in /code/vendor/sqkhor/editorjs-html/src/edjsHTML.php:70 Stack trace: #0 /code/vendor/sqkhor/editorjs-html/src/edjsHTML.php(17): edjsHTML::parse_function_error('canto_diptych') #1 [internal function]: edjsHTML::parse_block(Array) #2 /code/web/modules/custom/editorjs_custom_plugins/src/Parser/CustomParser.php(28): array_map(Array, Array) #3 /code/web/modules/custom/aws_event_pipeline/src/Mappers/v1/ArticleMapper.php(123): Drupal\editorjs_custom_plugins\Parser\CustomParser::parse(Array) #4 /code/web/modules/custom/aws_event_pipeline/src/AwsFormatter.php(168): Drupal\aws_event_pipeline\Mappers\v1\ArticleMapper->toAwsPayload(Object(Drupal\node\Entity\Node)) #5 /code/web/modules/custom/aws_event_pipeline/src/AwsFormatter.php(151): Drupal\aws_event_pipeline\AwsFormatter->getPayload(Object(Drupal\node\Entity\Node), Array) #6 /code/web/modules/custom/aws_event_pipeline/src/AwsEventSync.php(174): Drupal\aws_event_pipeline\AwsFormatter->getAwsMessage(Object(Drupal\node\Entity\Node), Object(Drupal\aws_event_pipeline\AwsEvent\AwsEvent), Array) #7 /code/web/modules/custom/aws_event_pipeline/src/Plugin/QueueWorker/AepQueueProcessor.php(177): Drupal\aws_event_pipeline\AwsEventSync->sendToAws(Object(Drupal\node\Entity\Node), Object(Drupal\aws_event_pipeline\AwsEvent\AwsEvent)) #8 /code/web/modules/contrib/ultimate_cron/src/QueueWorker.php(111): Drupal\aws_event_pipeline\Plugin\QueueWorker\AepQueueProcessor->processItem(Object(Drupal\aws_event_pipeline\AwsEvent\AwsEvent)) #9 [internal function]: Drupal\ultimate_cron\QueueWorker->queueCallback(Object(Drupal\ultimate_cron\Entity\CronJob)) #10 /code/web/modules/contrib/ultimate_cron/src/Entity/CronJob.php(325): call_user_func(Array, Object(Drupal\ultimate_cron\Entity\CronJob)) #11 /code/web/modules/contrib/ultimate_cron/src/Entity/CronJob.php(471): Drupal\ultimate_cron\Entity\CronJob->invokeCallback() #12 /code/web/modules/contrib/ultimate_cron/src/Plugin/ultimate_cron/Launcher/SerialLauncher.php(213): Drupal\ultimate_cron\Entity\CronJob->run(Object(Drupal\Core\StringTranslation\TranslatableMarkup)) #13 /code/web/modules/contrib/ultimate_cron/src/Plugin/ultimate_cron/Launcher/SerialLauncher.php(334): Drupal\ultimate_cron\Plugin\ultimate_cron\Launcher\SerialLauncher->launch(Object(Drupal\ultimate_cron\Entity\CronJob)) #14 /code/web/modules/contrib/ultimate_cron/src/Plugin/ultimate_cron/Launcher/SerialLauncher.php(309): Drupal\ultimate_cron\Plugin\ultimate_cron\Launcher\SerialLauncher->runThread('6145728', 1, Array) #15 /code/web/modules/contrib/ultimate_cron/src/UltimateCron.php(64): Drupal\ultimate_cron\Plugin\ultimate_cron\Launcher\SerialLauncher->launchJobs(Array) #16 /code/web/modules/contrib/ultimate_cron/src/ProxyClass/UltimateCron.php(70): Drupal\ultimate_cron\UltimateCron->run() #17 /code/web/core/modules/system/src/CronController.php(46): Drupal\ultimate_cron\ProxyClass\UltimateCron->run() #18 [internal function]: Drupal\system\CronController->run() #19 /code/web/core/lib/Drupal/Core/EventSubscriber/EarlyRenderingControllerWrapperSubscriber.php(123): call_user_func_array(Array, Array) #20 /code/web/core/lib/Drupal/Core/Render/Renderer.php(592): Drupal\Core\EventSubscriber\EarlyRenderingControllerWrapperSubscriber->Drupal\Core\EventSubscriber\{closure}() #21 /code/web/core/lib/Drupal/Core/EventSubscriber/EarlyRenderingControllerWrapperSubscriber.php(124): Drupal\Core\Render\Renderer->executeInRenderContext(Object(Drupal\Core\Render\RenderContext), Object(Closure)) #22 /code/web/core/lib/Drupal/Core/EventSubscriber/EarlyRenderingControllerWrapperSubscriber.php(97): Drupal\Core\EventSubscriber\EarlyRenderingControllerWrapperSubscriber->wrapControllerExecutionInRenderContext(Array, Array) #23 /code/vendor/symfony/http-kernel/HttpKernel.php(181): Drupal\Core\EventSubscriber\EarlyRenderingControllerWrapperSubscriber->Drupal\Core\EventSubscriber\{closure}() #24 /code/vendor/symfony/http-kernel/HttpKernel.php(76): Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object(Symfony\Component\HttpFoundation\Request), 1) #25 /code/web/modules/contrib/redirect_after_login/src/RedirectMiddleware.php(44): Symfony\Component\HttpKernel\HttpKernel->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true) #26 /code/web/core/lib/Drupal/Core/StackMiddleware/Session.php(58): Drupal\redirect_after_login\RedirectMiddleware->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true) #27 /code/web/core/lib/Drupal/Core/StackMiddleware/KernelPreHandle.php(48): Drupal\Core\StackMiddleware\Session->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true) #28 /code/web/core/modules/page_cache/src/StackMiddleware/PageCache.php(191): Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true) #29 /code/web/core/modules/page_cache/src/StackMiddleware/PageCache.php(128): Drupal\page_cache\StackMiddleware\PageCache->fetch(Object(Symfony\Component\HttpFoundation\Request), 1, true) #30 /code/web/core/modules/page_cache/src/StackMiddleware/PageCache.php(82): Drupal\page_cache\StackMiddleware\PageCache->lookup(Object(Symfony\Component\HttpFoundation\Request), 1, true) #31 /code/vendor/asm89/stack-cors/src/Cors.php(53): Drupal\page_cache\StackMiddleware\PageCache->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true) #32 /code/web/core/lib/Drupal/Core/StackMiddleware/ReverseProxyMiddleware.php(48): Asm89\Stack\Cors->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true) #33 /code/web/core/lib/Drupal/Core/StackMiddleware/NegotiationMiddleware.php(51): Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true) #34 /code/web/core/lib/Drupal/Core/StackMiddleware/StackedHttpKernel.php(51): Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true) #35 /code/web/core/lib/Drupal/Core/DrupalKernel.php(704): Drupal\Core\StackMiddleware\StackedHttpKernel->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true) #36 /code/web/index.php(19): Drupal\Core\DrupalKernel->handle(Object(Symfony\Component\HttpFoundation\Request)) #37 {main}
Indeed, the past is present everywhere here. Madrid was originally the Moorish citadel of Mayrit (Arabic for “plenty of waterways”), founded in the 9th century on the banks of the Manzanares River as a fortress to defend the former Islamic empire Al-Andalus from Christian armies. Today, the Palacio Real (Royal Palace of Madrid) and Catedral de Nuestra Señora de la Almudena stand on that strategic hilltop – an ideal starting place for a walking tour. The adjacent Plaza de la Almudena across from the cathedral offers sweeping views of the city. Nearby, you can explore the neo-classical Jardines de Sabatini, and walk along the Segovia Viaduct where, on a clear day, you can see the snow-capped Sierra de Guadarrama mountain range in the northwest. This leads you into the heart of Madrid’s historic neighbourhood La Latina, once Madrid’s moreria, or Moorish neighborhood that’s a photogenic maze of cobblestone streets, vibrant plazas and host to a 500-year-old flea market El Rastro.
Then there's the Golden Triangle, a concentration of world-class art museums that includes the Museo del Prado, Reina Sofía and Thyssen-Bornemisza. These museums are moments away from each other and house masterpieces by Velázquez, Dali, Picasso, Goya, El Greco and more. Reina Sofía is where you'll find Picasso's masterpiece Guernica and the Prado, arguably one of the greatest art museums in the world, is home to Goya’s haunting Black Paintings.
Beyond these established art institutions, there are a host of smaller, fascinating independent galleries and refurbished cultural spaces to discover. Many neighborhoods display a strong creative presence, such as Lavapiés with its street art, and Carabanchel, where former industrial spaces have transformed into studios and creative workshops.
Ah, and let’s dive into the food! Over the last decade, Madrid’s gastronomic scene has exploded into a Michelin-starred universe, influenced by an increasingly diverse population and creative Michelin-awarded chefs topping the World’s Best lists, embracing experimentation while still respecting the roots of Spanish cuisine. Try the two-star DSTaGE for a fusion of Spanish, Japanese and Mexican food cooked in full view of diners, or the one-star Ricardo Sanz Wellington for what is considered by many to be the best sushi in the city.
Or cozy up in one of the city's centenarios, establishments over one hundred years old, like El Sobrino del Botín, recognized by Guinness World Records as the world's oldest restaurant. It once counted Hemingway (who mentioned it in The Sun Also Rises) and Francisco Goya (who worked there as a dishwasher before his painting career) among its famous patrons.
Alternatively, you can find incredible local produce at Madrid's mercados (markets). Try Mercado de San Miguel to taste all sorts of delicious gourmet food with stalls specializing in seafood, cheese, charcuterie and lots more. Or head to La Latina for a tapas crawl of some of the city's best and most authentic bars.
The one thing Madrid famously does not have is a beach, unlike Barcelona. But you could argue that has helped the city maintain a more balanced tourism environment with fewer seasonal tourists, weekend city breakers, or cruise crowds, allowing visitors to experience a more authentic Spanish cultural immersion. We do have beautiful parks, though, and on a summer's day, before noon, there's no more relaxing experience than floating around Parque del Buen Retiro's lake on a rowboat.