pythonweb-scrapingbeautifulsoup

Why do I get a "IndexError: list index out of range"? (Beautiful Soup)


I am trying to scrape a table here very similar in structure to my previous question. I just changed the attributes names but I am getting index out of range error. This is the TR:

<TR VALIGN="bottom">
<TD BGCOLOR=#cc6600 ALIGN="center" ><FONT FACE="Verdana, Arial, Helvetica, sans-serif">1</FONT></TD>
<TD BGCOLOR=#CC6600 ALIGN="left" ><FONT FACE="Verdana, Arial, Helvetica, sans-serif">Wachtell, Lipton</FONT></TD>
<TD BGCOLOR=#CC6600 ALIGN="center" ><FONT FACE="Verdana, Arial, Helvetica, sans-serif">1 </FONT></TD>
<TD BGCOLOR=#CC6600 ALIGN="center" ><FONT FACE="Verdana, Arial, Helvetica, sans-serif">9.1%</FONT></TD>
<TD BGCOLOR=#FF9933 ALIGN="center" ><FONT FACE="Verdana, Arial, Helvetica, sans-serif">$3,385,000 </FONT></TD>
</TR>

I am trying to get the first ALIGN="left" and the last ALIGN="center". But the index for the last line gives the error. Here is the code I am using:

    soup = BeautifulSoup(urllib.urlopen("http://www.law.com/special/professionals/amlaw/amlaw200/amlaw200_ppp.html"))
    rows = soup.findAll(name='tr',attrs={'valign':'bottom'}, limit=13)
    for row in rows:
        tds_left = row.findAll(name='td',attrs={'align':'left'}, limit=13)
        tds_center = row.findAll(name='td',attrs={'align':'center'}, limit=13)
        if tds_left:
            firm_name = tds_left[0].text
        if tds_center:
            # the following line gives an error if the index is different than 0
            ppp = tds_center[0].text

Thanks!

Update

Traceback (most recent call last):
  File "C:\Program Files (x86)\Google\google_appengine\google\appengine\ext\webapp\_webapp25.py", line 701, in __call__
    handler.get(*groups)
  File "C:\U\A\D\\toplawfirms.py", line 384, in get
    ppp = tds_center[2].text
IndexError: list index out of range

Update

As response to agf's comment here are print tds_center and for item in tds_center: print item?

tds_center: []
tds_center: []
tds_center: []
tds_center: [ ]
item: 
tds_center: []
item: 
tds_center: [Rank By 
Profits Per 
Partner, Rank By 
Revenue 
Per Lawyer, Change In 
Profits per 
Partner
from 1998, Profits Per 
Partner]
item: Rank By 
Profits Per 
Partner
item: Rank By 
Revenue 
Per Lawyer
item: Change In 
Profits per 
Partner
from 1998
item: Profits Per 
Partner
tds_center: [1, 1 , 9.1%, $3,385,000 ]
item: 1
item: 1 
item: 9.1%
item: $3,385,000 
tds_center: [2, 2 , 5.0%, $3,055,000 ]
item: 2
item: 2 
item: 5.0%
item: $3,055,000 
tds_center: [3, 4 , 2.9%, $2,110,000 ]
item: 3
item: 4 
item: 2.9%
item: $2,110,000 
tds_center: [4, 3 , 8.7%, $1,790,000 ]
item: 4
item: 3 
item: 8.7%
item: $1,790,000 
tds_center: [5, 9 , 6.9%, $1,710,000 ]
item: 5
item: 9 
item: 6.9%
item: $1,710,000 
tds_center: [6, 6 , 10.8%, $1,655,000 ]
item: 6
item: 6 
item: 10.8%
item: $1,655,000 
tds_center: [7, 5 , 5.1%, $1,610,000 ]
item: 7
item: 5 
item: 5.1%
item: $1,610,000 

Solution

  • I modified how you are getting the last "center" td in the following code:

    import urllib
    from BeautifulSoup import BeautifulSoup
    soup = BeautifulSoup(urllib.urlopen("http://www.law.com/special/professionals/amlaw/amlaw200/amlaw200_ppp.html"))
    rows = soup.findAll(name='tr',attrs={'valign':'bottom'}, limit=13)
    for row in rows:
        tds_left = row.findAll(name='td',attrs={'align':'left'}, limit=13)
        tds_center = row.findAll(name='td',attrs={'align':'center'}, limit=13)
        if tds_left:
            firm_name = tds_left[0].text
            print firm_name
        if tds_center:
            # get last td "center"
            ppp = tds_center[-1].text
            print ppp
    

    and got the following result:

    Firm
    Profits PerPartner
    Wachtell, Lipton
    $3,385,000
    Robins, Kaplan
    $3,055,000
    Cravath
    $2,110,000
    Sullivan &amp; Cromwell
    $1,790,000
    Cahill Gordon
    $1,710,000
    Simpson Thacher
    $1,655,000
    Davis Polk
    $1,610,000