refactor scrape_lyrics_from_url into smaller functions

This commit is contained in:
Fabrice Laporte 2014-09-23 13:21:31 +02:00
parent ea89cf32eb
commit a938e68c98
3 changed files with 236 additions and 215 deletions

View file

@ -24,6 +24,8 @@ import unicodedata
import difflib
import itertools
from bs4 import BeautifulSoup, Comment
from beets.plugins import BeetsPlugin
from beets import ui
from beets import config
@ -340,25 +342,31 @@ def is_lyrics(text, artist=None):
return len(badTriggersOcc) < 2
def scrape_lyrics_from_url(url):
"""Scrape lyrics from a URL. If no lyrics can be found, return None
instead.
def _scrape_normalize_eol(html):
"""Return html text where only authorized eol marker is \n
"""
from bs4 import BeautifulSoup, Comment
html = fetch_url(url)
if not html:
return None
soup = BeautifulSoup(html)
for tag in soup.findAll('br'):
tag.replaceWith('\n')
html.replace('\r','\n')
# Replace <br> without introducing superfluous newline in the output
BREAK_RE = re.compile(r'\n?\s*<br\s*/?>\s*\n?', re.I)
html = BREAK_RE.sub('\n', html)
return html
def _scrape_filter_soup(soup):
"""Remove sections from soup that cannot be parents of lyrics section
"""
# Remove non relevant html parts
[s.extract() for s in soup(['head', 'script'])]
comments = soup.findAll(text=lambda text: isinstance(text, Comment))
[s.extract() for s in comments]
# Remove ads now as they can interrupt the lyrics block
ads = soup.find_all('div', class_=re.compile('ad'))
[s.extract() for s in ads]
return soup
def _scrape_streamline_soup(soup):
"""Transform soup into a succession of <p></p> blocks
"""
try:
for tag in soup.findAll(True):
tag.name = 'p' # keep tag contents
@ -379,20 +387,48 @@ def scrape_lyrics_from_url(url):
pTag = soup.new_tag("p")
bodyTag.parent.insert(0, pTag)
pTag.insert(0, bodyTag)
return soup
def _scrape_longest_paragraph(soup):
"""Return longest paragraph from soup
"""
tagTokens = []
for tag in soup.findAll('p'):
soup2 = BeautifulSoup(str(tag))
# Extract all text of <p> section.
tagTokens += soup2.findAll(text=True)
if tagTokens:
# Lyrics are expected to be the longest paragraph
tagTokens = sorted(tagTokens, key=len, reverse=True)
soup = BeautifulSoup(tagTokens[0])
return unescape(tagTokens[0].strip("\n\r: "))
def _scrape_custom_process_soup(soup):
"""Apply custom operations on soup to handle cases for specific websites
"""
# metrolyrics.com: lyrics text is splitted into multiple <p class='verse'>
for match in soup.find_all('p', class_='verse'):
match.insert_before('\n')
match.unwrap()
return soup
def scrape_lyrics_from_html(html):
"""Scrape lyrics from a URL. If no lyrics can be found, return None
instead.
"""
if not html:
return None
html = _scrape_normalize_eol(html)
soup = BeautifulSoup(html)
soup = _scrape_filter_soup(soup)
soup = _scrape_streamline_soup(soup)
soup = _scrape_custom_process_soup(soup)
# print(soup)
soup = _scrape_longest_paragraph(soup)
return soup
def fetch_google(artist, title):
"""Fetch lyrics from Google search results.
@ -416,7 +452,9 @@ def fetch_google(artist, title):
urlTitle = item['title']
if not is_page_candidate(urlLink, urlTitle, title, artist):
continue
lyrics = scrape_lyrics_from_url(urlLink)
html = fetch_url(urlLink)
lyrics = scrape_lyrics_from_html(html)
if not lyrics:
continue

View file

@ -64,36 +64,16 @@ def is_lyrics_content_ok(title, text):
return False
class LyricsPluginTest(unittest.TestCase):
def setUp(self):
"""Set up configuration"""
lyrics.LyricsPlugin()
def test_default_ok(self):
"""Test each lyrics engine with the default query"""
lyrics.fetch_url = MockFetchUrl()
for f in (lyrics.fetch_lyricswiki, lyrics.fetch_lyricscom):
res = f(definfo['artist'], definfo['title'])
self.assertTrue(lyrics.is_lyrics(res))
self.assertTrue(is_lyrics_content_ok(definfo['title'], res))
def test_missing_lyrics(self):
self.assertFalse(lyrics.is_lyrics(LYRICS_TEXTS['missing_texts']))
class LyricsScrapingPluginTest(unittest.TestCase):
class LyricsSourcesPluginTest(unittest.TestCase):
# Every source entered in default beets google custom search engine
# must be listed below.
# Use default query when possible, or override artist and title field
# if website don't have lyrics for default query.
sourcesOk = [
dict(definfo, url='http://www.songlyrics.com',
path=u'/the-beatles/lady-madonna-lyrics'),
dict(definfo, url=u'http://www.elyricsworld.com',
path=u'/lady_madonna_lyrics_beatles.html'),
# dict(definfo, url='http://www.songlyrics.com',
# path=u'/the-beatles/lady-madonna-lyrics'),
# dict(definfo, url=u'http://www.elyricsworld.com',
# path=u'/lady_madonna_lyrics_beatles.html'),
dict(artist=u'Beres Hammond', title=u'I could beat myself',
url=u'http://www.reggaelyrics.info',
path=u'/beres-hammond/i-could-beat-myself'),
@ -111,61 +91,65 @@ class LyricsScrapingPluginTest(unittest.TestCase):
path=u'/lyrics/beatles/ladymadonna.html'),
dict(definfo, url=u'http://www.chartlyrics.com',
path=u'/_LsLsZ7P4EK-F-LD4dJgDQ/Lady+Madonna.aspx'),
]
# Websites that can't be scraped yet and whose results must be
# flagged as invalid lyrics.
sourcesFail = [
dict(definfo, url=u'http://www.smartlyrics.com',
path=u'/Song18148-The-Beatles-Lady-Madonna-lyrics.aspx'),
dict(definfo, url='http://www.metrolyrics.com/',
path='best-for-last-lyrics-adele.html'),
dict(definfo, artist=u'Lilly Wood & the prick', title=u"Hey it's ok",
url=u'http://www.lyricsmania.com',
path=u'/hey_its_ok_lyrics_lilly_wood_and_the_prick.html'),
dict(definfo, url=u'http://www.lyrics007.com',
path=u'/The%20Beatles%20Lyrics/Lady%20Madonna%20Lyrics.html'),
dict(definfo, url=u'http://www.smartlyrics.com',
path=u'/Song18148-The-Beatles-Lady-Madonna-lyrics.aspx'),
dict(definfo, url='http://www.releaselyrics.com',
path=u'/e35f/the-beatles-lady-madonna'),
path=u'/e35f/the-beatles-lady-madonna'),
dict(definfo, url='http://www.metrolyrics.com/',
path='lady-madonna-lyrics-beatles.html'),
]
# Websites that return truncated lyrics because of scraping issues, and
# thus should not be included as sources to Google CSE.
# They are good candidates for later inclusion after improvement
# iterations of the scraping algorithm.
sourcesIncomplete = [
dict(definfo, artist=u'Lilly Wood & the prick', title=u"Hey it's ok",
url=u'http://www.lacoccinelle.net',
path=u'/paroles-officielles/550512.html'),
# Websites that can't be scraped yet.
# The reason why the scraping fail is indicated before each source dict.
sourcesFail = [
# Lyrics consist in multiple small <p> sections instead of a long one
#dict(definfo, artist=u'Lilly Wood & the prick', title=u"Hey it's ok",
# url=u'http://www.lacoccinelle.net',
# path=u'/paroles-officielles/550512.html'),
]
def setUp(self):
"""Set up configuration"""
lyrics.LyricsPlugin()
lyrics.fetch_url = MockFetchUrl()
def test_default_ok(self):
"""Test each lyrics engine with the default query"""
for f in (lyrics.fetch_lyricswiki, lyrics.fetch_lyricscom):
res = f(definfo['artist'], definfo['title'])
self.assertTrue(lyrics.is_lyrics(res))
self.assertTrue(is_lyrics_content_ok(definfo['title'], res))
def test_missing_lyrics(self):
self.assertFalse(lyrics.is_lyrics(LYRICS_TEXTS['missing_texts']))
def test_sources_ok(self):
for s in self.sourcesOk:
url = s['url'] + s['path']
res = lyrics.scrape_lyrics_from_url(url)
res = lyrics.scrape_lyrics_from_html(lyrics.fetch_url(url))
self.assertTrue(lyrics.is_lyrics(res), url)
self.assertTrue(is_lyrics_content_ok(s['title'], res), url)
def test_sources_fail(self):
for s in self.sourcesFail:
url = s['url'] + s['path']
res = lyrics.scrape_lyrics_from_url(url)
# very unlikely these sources pass if the scraping algo is not
# tweaked on purpose for these cases
self.assertFalse(lyrics.is_lyrics(res), "%s => %s" % (url, res))
def test_sources_incomplete(self):
for s in self.sourcesIncomplete:
url = s['url'] + s['path']
res = lyrics.scrape_lyrics_from_url(url)
self.assertTrue(lyrics.is_lyrics(res))
# these sources may pass if the html source evolve or after
# a random improvement in the scraping algo: we want to
# be noticed if it's the case.
if is_lyrics_content_ok(s['title'], res):
log.debug(u'Source {0} actually return valid lyrics!'
.format(s['url']))
url = s['url'] + s['path']
html = lyrics.fetch_url(url)
res = lyrics.scrape_lyrics_from_html(html)
if lyrics.is_lyrics(res):
if is_lyrics_content_ok(s['title'], res):
log.info(u'{0} can be added to sources :\n{1}'
.format(s['url'], res))
else:
log.info(u'{0} return invalid lyrics:\n{1}'.
format(s['url'], res))
def test_is_page_candidate(self):
for s in self.sourcesOk:

View file

@ -1,155 +1,154 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<!doctype html>
<!--[if lt IE 7]> <html class="ie6 oldie"> <![endif]-->
<!--[if IE 7]> <html class="ie7 oldie"> <![endif]-->
<!--[if IE 8]> <html class="ie8 oldie"> <![endif]-->
<!--[if gt IE 8]><!-->
<html>
<!--<![endif]-->
<head>
<title>The Beatles - Lady Madonna Lyrics</title>
<meta http-equiv=content-language content=en-us>
<meta name="robots" content="INDEX,FOLLOW" >
<meta property="fb:admins" content="100002318964661" />
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta http-equiv="content-language" content="en-us">
<meta name="keywords" content="Lady Madonna, The Beatles, The Beatles Lady Madonna Lyrics, Lady Madonna song lyrics, Lady Madonna lyrics">
<meta name="description" content="Read guaranteed accurate human-edited The Beatles Lady Madonna lyrics from lyrics007">
<link rel="canonical" href="http://www.lyrics007.com/The%20Beatles%20Lyrics/Lady%20Madonna%20Lyrics.html" />
<link rel="stylesheet" href="http://www.lyrics007.com/s.css" rev="stylesheet" type="text/css">
<link href='http://fonts.googleapis.com/css?family=Oswald' rel='stylesheet' type='text/css'>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.3/jquery.min.js"></script>
<script type="text/javascript" src="http://www.lyrics007.com/lyrics007.js"></script>
<script type="text/javascript" >
/* 007 - 728x90 - Top - Brand Ads only */
cf_page_artist = "The Beatles";
cf_page_song = "Lady Madonna";
</script>
<meta property="fb:admins" content="100002318964661" />
<title>The Beatles Lady Madonna Lyrics | Lyrics007</title>
<link href="/boilerplate.css" rel="stylesheet" type="text/css">
<link href="/007.css" rel="stylesheet" type="text/css">
<!--[if lt IE 9]>
<script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
<script src="/respond.min.js"></script>
</head>
<body>
<script type="text/javascript" src="/top.js"></script>
<div class="ads_728">
<script type="text/javascript">
cf_page_genre = "";
cf_adunit_id = "39380715";
</script>
<script src="//srv.clickfuse.com/showads/showad.php"></script></div>
<div class="navigate"><a href="http://www.lyrics007.com">Home</a>&nbsp;>> The Beatles - Lady Madonna Lyrics</div>
<div class="main">
<h1>The Beatles - Lady Madonna Lyrics</h1>
<div class="content">
<div style="display:block;float:right;padding-top:10px;padding-right:0px;padding-bottom:10px;"><script type="text/javascript"><!--
google_ad_client = "ca-pub-0919305250342516";
/* 160x600, created 12/9/08 */
google_ad_slot = "8583291572";
google_ad_width = 160;
google_ad_height = 600;
//-->
</script>
<script type="text/javascript"
src="//pagead2.googlesyndication.com/pagead/show_ads.js">
</script></div>Writer(s):LENNON, JOHN WINSTON / MCCARTNEY, PAUL JAMES<br>Artist: <a href="http://www.lyrics007.com/The%20Beatles%20Lyrics.html">The Beatles Lyrics</a>
<br>Popularity: 9957 users have visited this page.<br>Album: Track 22 on The Beatles Collection, Volume 5: Sgt. Pepper's Lonely Hearts Club Band<br>
<div itemscope itemtype="http://data-vocabulary.org/Review-aggregate">Rate:
<span itemprop="itemreviewed">Lady Madonna</span> gets avg. rating
<span itemprop="rating" itemscope itemtype="http://data-vocabulary.org/Rating">
<span itemprop="average">7.3</span>
out of <span itemprop="best">10</span>
</span> based on <span itemprop="votes">3</span> ratings. Rate the song now!!!</div>
<div class=rating></div><div class=rating></div><div class=rating></div><div class=rating></div><div class=rating></div><div class=rating></div><div class=rating></div><div class=rating></div><div class=rating></div><div class=rating></div><br><br>
<div class="gridContainer clearfix">
<div style="width:100%;text-align:center;">
<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
<!-- auto_size -->
<ins class="adsbygoogle"
style="display:block"
data-ad-client="ca-pub-0919305250342516"
data-ad-slot="9819980608"
data-ad-format="auto"></ins>
<script>
(adsbygoogle = window.adsbygoogle || []).push({});
</script></div>
<a href="http://www.lyrics007.com">Home</a>&nbsp;>> <a href="http://www.lyrics007.com/The%20Beatles%20Lyrics.html">The Beatles Lyrics</a>&nbsp;>> The Beatles - Lady Madonna Lyrics<div id="LayoutDiv1">
<h1>The Beatles Lady Madonna Lyrics</h1>
Artist: <a href="http://www.lyrics007.com/The Beatles%20Lyrics.html">The Beatles Lyrics</a>
<br />Popularity : 2898 users have visited this page.
<br />Album: Track 22 on <i>The Beatles Collection, Volume 5: Sgt. Pepper's Lonely Hearts Club Band</i>
<br />Recorded: 3 and 6 February 1968, EMI Studios, London
<br />Writer(s): LennonMcCartney
<br />Genre: Rock and roll
<br />Producer(s): George Martin
<br />Length: 2:16
<br />Certification: Platinum (RIAA)<br />Format: 7" single
<br />Label: Parlophone (UK), Capitol (US)
<br />Released: 15 March 1968
<br /><br><br>Lady Madonna, children at your feet
<BR>
Wonder how you manage to make ends meet
<BR>
Who find the money when you pay the rent
<BR>
Did you think that money was heaven sent
<BR>
<!-- START: RTM Ad -->
<div class="rtm_ad" data-sid="LWOS" data-subtag="ros" data-artist="The Beatles" data-song="Lady Madonna" data-search="">
<!-- Note: This fail-safe link will be dynamically replaced -->
<a href="http://www.ringtonematcher.com/go/?sid=LWOS" rel="nofollow" target="_blank" style="text-decoration: none;">
<img src="//cdn.ringtonematcher.com/images/icons/phones/darkblue_left.gif" style="border-style: none; vertical-align: middle; margin-right: 5px;">
<span style="text-decoration: underline; color: red; font: bold 16px Arial; verticalalign: middle;">Send Ringtones to your Cell</span>
<img src="//cdn.ringtonematcher.com/images/icons/phones/darkblue_right.gif" style="border-style: none; verticalalign: middle; margin-left: 5px;"></a>
</div>
<!-- END: RTM Ad -->Lady Madonna, children at your feet<br />
Wonder how you manage to make ends meet<br />
Who find the money when you pay the rent<br />
Did you think that money was heaven sent<br />
<br />
Friday night arrives without a suitcase<br />
Sunday morning creeping like a nun<br />
Monday's child has learned to tie his bootlegs<br />
See how they run<br />
<br />
Lady Madonna, baby at your breast<br />
Wonders how you manage to feed the rest<br />
Pa pa pa pa,<br />
See how they run<br />
<br />
Lady Madonna lying on the bed<br />
Listen to the music playing in your head<br />
<br />
Tuesday afternoon is never ending<br />
Wednesday morning papers didn't come<br />
Thursday night you stocking needed mending<br />
See how they run<br />
<br />
Lady Madonna, children at your feet<br />
Wonder how you manage to make ends meet<br>
<!-- START: RTM Ad -->
<div class="rtm_ad" data-sid="LWOS" data-subtag="ros" data-artist="The Beatles" data-song="Lady Madonna" data-search="">
<!-- Note: This fail-safe link will be dynamically replaced -->
<a href="http://www.ringtonematcher.com/go/?sid=LWOS" rel="nofollow" target="_blank" style="text-decoration: none;">
<img src="//cdn.ringtonematcher.com/images/icons/phones/darkblue_left.gif" style="border-style: none; vertical-align: middle; margin-right: 5px;">
<span style="text-decoration: underline; color: red; font: bold 16px Arial; verticalalign: middle;">Send Ringtones to your Cell</span>
<img src="//cdn.ringtonematcher.com/images/icons/phones/darkblue_right.gif" style="border-style: none; verticalalign: middle; margin-left: 5px;"></a>
</div>
<!-- END: RTM Ad -->
<script language='javaScript' type='text/javascript'>
document.write("<img src='http://licensing.lyrics007.com/in" + "fo.php?id=1536077&referer=0'>");
</script><br>
<form action="/correct.php" method="post" id="correctit" target="_blank">
<input type="hidden" name="id" value="TXpJNU1UWXg" />
</form><br>If you believe the lyrics are not correct you can <a href="#" onclick="document.getElementById('correctit').submit();return false;">Submit Corrections</a> to us<br>Add a comment and share what The Beatles Lady Madonna Lyrics means to you with your friends:<br>
<fb:comments href="http://www.lyrics007.com/The%20Beatles%20Lyrics/Lady%20Madonna%20Lyrics.html" num_posts="5" width="640"></fb:comments>
Featured lyrics:
<ul>
<li><a href="/Johnny%20Cash%20Lyrics/Ship%20Those%20Niggers%20Back%20Lyrics.html">Johnny Rebel - Ship Those Niggers Back Lyrics</a>
<li><a href="/Demi%20Lovato%20Lyrics/Never%20Been%20Hurt%20Lyrics.html">Demi Lovato - Never Been Hurt Lyrics</a>
<li><a href="/Blink-182%20Lyrics/Roller%20Coaster%20Lyrics.html">Blink-182 - Roller Coaster Lyrics</a>
<li><a href="/Kenny%20Chesney%20Lyrics/I%20Go%20Back%20Lyrics.html">Kenny Chesney - I Go Back Lyrics</a>
<li><a href="/Toto%20Lyrics/Hold%20The%20Line%20Lyrics.html">Toto - Hold the Line Lyrics</a>
<li><a href="/Backstreet%20Boys%20Lyrics/The%20One%20Lyrics.html">Backstreet Boys - The One Lyrics</a>
<li><a href="/Beyonce%20Lyrics/Standing%20On%20The%20Sun%20Lyrics.html">Beyonce - Standing On The Sun Lyrics</a>
<li><a href="/Johnny%20Cash%20Lyrics/A%20Thing%20Called%20Love%20Lyrics.html">Johnny Cash - A Thing Called Love Lyrics</a>
<li><a href="/Sugababes%20Lyrics/Too%20Lost%20In%20You%20Lyrics.html">Sugababes - Too Lost in You Lyrics</a>
<li><a href="/Green%20Day%20Lyrics/Paranoia%20Lyrics.html">Harvey Danger - Flagpole Sitta Lyrics</a>
</ul>Lyrics © Sony/ATV Music Publishing LLC
<br><img src="/images/LF.png">
</div>
<div class="side_bar">
<script type="text/javascript"><!--
google_ad_client = "ca-pub-0919305250342516";
/* 300x250, created 9/18/08 */
google_ad_slot = "8367624871";
google_ad_width = 300;
google_ad_height = 250;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script><br>
<form action="/print.php" method="post" id="printit" target="_blank">
<input type="hidden" name="id" value="TXpJNU1UWXg" /></form><br><div style="width:300px;">
<div style="width: 60px; float: left;"><a class=twitter-share-button href="https://twitter.com/share" data-count="vertical" data-lang="en" data-url="http://www.lyrics007.com/The%20Beatles%20Lyrics/Lady%20Madonna%20Lyrics.html">Tweet</a></div>
<div style="width:60px; float:right;"><a href="#" onclick="document.getElementById('printit').submit();return false;" rel="nofollow"><img src="/images/print.gif" border=0></a></div>
<div style="width:80px;padding-left:30px; float:left;">
<script type="text/javascript" src="https://apis.google.com/js/plusone.js"></script>
<g:plusone size="tall"></g:plusone></div>
<div style="width:70px; flat:left;" class="fb-like" data-href="http://www.lyrics007.com/The%20Beatles%20Lyrics/Lady%20Madonna%20Lyrics.html" data-send="false" data-layout="box_count" data-width="70" data-show-faces="false"></div>
</div><br>More lyrics from The Beatles Collection, Volume 5: Sgt. Pepper's Lonely Hearts Club Band album<br>
<ol><li><a href="/The%20Beatles%20Lyrics/Sgt.%20Pepper's%20Lonely%20Hearts%20Club%20Band%20Lyrics.html">Sgt. Pepper's Lonely Hearts Club Band Lyrics</a><li><a href="/The%20Beatles%20Lyrics/A%20Little%20Help%20From%20My%20Friends%20Lyrics.html">With a Little Help From My Friends Lyrics</a><li><a href="/The%20Beatles%20Lyrics/Lucy%20in%20the%20Sky%20with%20Diamonds%20Lyrics.html">Lucy in the Sky With Diamonds Lyrics</a><li><a href="/The%20Beatles%20Lyrics/Getting%20Better%20Lyrics.html">Getting Better Lyrics</a><li><a href="/The%20Beatles%20Lyrics/Fixing%20a%20Hole%20Lyrics.html">Fixing a Hole Lyrics</a><li><a href="/The%20Beatles%20Lyrics/She's%20Leaving%20Home%20Lyrics.html">She's Leaving Home Lyrics</a><li><a href="/The%20Beatles%20Lyrics/Being%20For%20The%20Benefit%20Of%20Mr.%20Kite%20Lyrics.html">Being for the Benefit of Mr. Kite Lyrics</a><li><a href="/The%20Beatles%20Lyrics/Within%20You%20Without%20You%20Lyrics.html">Within You Without You Lyrics</a><li><a href="/The%20Beatles%20Lyrics/When%20I'm%20Sixty-four%20Lyrics.html">When I'm Sixty-Four Lyrics</a><li><a href="/The%20Beatles%20Lyrics/Lovely%20Rita%20Lyrics.html">Lovely Rita Lyrics</a><li><a href="/The%20Beatles%20Lyrics/Good%20Morning%20Good%20Morning%20Lyrics.html">Good Morning Good Morning Lyrics</a><li><a href="/The%20Beatles%20Lyrics/Sgt.%20Pepper's%20Lonely%20Hearts%20Club%20Band%20(Reprise)%20Lyrics.html">Sgt. Pepper's Lonely Hearts Club Band (reprise) Lyrics</a><li><a href="/The%20Beatles%20Lyrics/A%20Day%20in%20Life%20Lyrics.html">A Day in the Life Lyrics</a><li><a href="/The%20Beatles%20Lyrics/I%20Want%20To%20Hold%20Your%20Hand%20Lyrics.html">I Want to Hold Your Hand Lyrics</a><li><a href="/The%20Beatles%20Lyrics/Long%20Tall%20Sally%20Lyrics.html">Long Tall Sally Lyrics</a><li><a href="/The%20Beatles%20Lyrics/Yes%20It%20Is%20Lyrics.html">Yes It Is Lyrics</a><li><a href="/The%20Beatles%20Lyrics/Day%20Tripper%20Lyrics.html">Day Tripper Lyrics</a><li><a href="/The%20Beatles%20Lyrics/We%20Can%20Work%20It%20Out%20Lyrics.html">We Can Work It Out Lyrics</a><li><a href="/The%20Beatles%20Lyrics/Paperback%20Writer%20Lyrics.html">Paperback Writer Lyrics</a><li><a href="/The%20Beatles%20Lyrics/The%20Inner%20Light%20Lyrics.html">The Inner Light Lyrics</a><li><a href="/The%20Beatles%20Lyrics/Revolution%20Lyrics.html">Revolution Lyrics</a><li><a href="/The%20Beatles%20Lyrics/Lady%20Madonna%20Lyrics.html">Lady Madonna Lyrics</a><li><a href="/The%20Beatles%20Lyrics/Hey%20Jude%20Lyrics.html">Hey Jude Lyrics</a></ol><script>
<BR>
Friday night arrives without a suitcase
<BR>
Sunday morning creeping like a nun
<BR>
Monday's child has learned to tie his bootlace
<BR>
See how they run
<BR>
<BR>
Lady Madonna, baby at your breast
<BR>
Wonders how you manage to feed the rest
<div class="ad300"><font color=red>sponsored links</font><br><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
<!-- l_007 -->
<ins class="adsbygoogle"
style="display:inline-block;width:300px;height:250px"
data-ad-client="ca-pub-0919305250342516"
data-ad-slot="2166102852"></ins>
<script>
(adsbygoogle = window.adsbygoogle || []).push({});
</script></div>
<BR>
<BR>
See how they run
<BR>
<BR>
Lady Madonna lying on the bed
<BR>
Listen to the music playing in your head
<BR>
<BR>
Tuesday afternoon is never ending
<BR>
Wednesday morning papers didn't come
<BR>
Thursday night your stocking needed mending
<BR>
See how they run
<BR>
<BR>
Lady Madonna, children at your feet
<BR>
Wonder how you manage to make ends meet
<br><br>Thanks to Quidam for the correction
<div class="album_cover"><img src="/images/cover_art/80/23/9" alt="The Beatles's Lady Madonna album cover" title="The Beatles's Lady Madonna album cover"></div><center><iframe src="//www.facebook.com/plugins/like.php?href=http%3A%2F%2Fwww.lyrics007.com%2FThe%2520Beatles%2520Lyrics%2FLady%2520Madonna%2520Lyrics.html&amp;width&amp;layout=button_count&amp;action=like&amp;show_faces=false&amp;share=true&amp;height=21" scrolling="no" frameborder="0" style="border:none; overflow:hidden; height:21px; width:150px;" allowTransparency="true"></iframe></center><div style="clear:both;text-align:center;"><script>
/* Lyrics007 - 300x250 - Brand Ads Only */
cf_page_artist = "The Beatles";
cf_page_song = "Lady Madonna";
cf_page_genre = "";
cf_adunit_id = "39380716";
cf_adunit_id = "39380905";
</script>
<script src="//srv.clickfuse.com/showads/showad.php"></script>
<br><br>
<script src="//srv.clickfuse.com/showads/showad.php"></script></div>
<div id="disqus_thread"></div>
<script type="text/javascript">
/* * * CONFIGURATION VARIABLES: EDIT BEFORE PASTING INTO YOUR WEBPAGE * * */
var disqus_shortname = 'mylyrics007'; // required: replace example with your forum shortname
/* * * DON'T EDIT BELOW THIS LINE * * */
(function() {
var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;
dsq.src = '//' + disqus_shortname + '.disqus.com/embed.js';
(document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
})();
</script>
<noscript>Please enable JavaScript to view the <a href="http://disqus.com/?ref_noscript">comments powered by Disqus.</a></noscript>
<a href="http://disqus.com" class="dsq-brlink">comments powered by <span class="logo-disqus">Disqus</span></a>
<br>The hottest lyrics from The Beatles<ul><ul><li><a href="/The%20Beatles%20Lyrics/Let%20it%20Be%20Lyrics.html">Let It Be Lyrics</a>
<li><a href="/The%20Beatles%20Lyrics/Here%20Comes%20The%20Sun%20Lyrics.html">Here Comes the Sun Lyrics</a>
<li><a href="/The%20Beatles%20Lyrics/Come%20Together%20Lyrics.html">Come Together Lyrics</a>
<li><a href="/The%20Beatles%20Lyrics/Across%20The%20Universe%20Lyrics.html">Across the Universe Lyrics</a>
<li><a href="/The%20Beatles%20Lyrics/While%20My%20Guitar%20Gently%20Weeps%20Lyrics.html">While My Guitar Gently Weeps Lyrics</a>
<li><a href="/The%20Beatles%20Lyrics/Yesterday%20Lyrics.html">Yesterday Lyrics</a>
<li><a href="/The%20Beatles%20Lyrics/Help!%20Lyrics.html">Help! Lyrics</a>
<li><a href="/The%20Beatles%20Lyrics/Revolution%20Lyrics.html">Revolution Lyrics</a>
<li><a href="/The%20Beatles%20Lyrics/Hello%20Goodbye%20Lyrics.html">Hello Goodbye Lyrics</a>
<li><a href="/The%20Beatles%20Lyrics/Can't%20Buy%20Me%20Love%20Lyrics.html">Can't Buy Me Love Lyrics</a>
</ul></ul>
<br>
<script language="javascript" type="text/javascript">
document.write("<img src=\"http://licensing.lyrics007.com/info.php?id=1536077\">");
</script>
<br><img src="/images/LF.png">
</div>
</div>
<div class="bottom">Lyrics007 gets licensed to display lyrics and pay the lyrics writers through LyricFind. The most of song titles are calibrated according to wikipedia</div>
<div class="copyright">&nbsp;&copy;COPYRIGHT 2012, LYRICS007.COM, ALL RIGHTS RESERVED.</div>
<div id="myDiv"></div>
<div>&nbsp;&copy;COPYRIGHT 2014, LYRICS007.COM, ALL RIGHTS RESERVED.</div>
<!--329161-->
</div>
</body>
</html>