【问题标题】:Why do I get a "IndexError: list index out of range"? (Beautiful Soup)为什么我会收到“IndexError:列表索引超出范围”? (美汤)
【发布时间】:2011-11-30 07:17:51
【问题描述】:

我正在尝试抓取一个与my previous question 结构非常相似的表here。我刚刚更改了属性名称,但出现index out of range 错误。这是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>

我正在尝试获取第一个 ALIGN="left" 和最后一个 ALIGN="center"。但是最后一行的索引给出了错误。这是我正在使用的代码:

    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

谢谢!

更新

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

更新

作为对agf 评论的回复,这里有print tds_centerfor 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 

【问题讨论】:

  • 请显示完整的回溯,以便我们知道错误的来源。
  • print tds_center 显示什么? for item in tds_center: print item 呢?
  • @Thomas K:我添加了完整的回溯。谢谢。
  • @agf:我在问题中添加了值。谢谢

标签: python screen-scraping beautifulsoup web-scraping


【解决方案1】:

我在以下代码中修改了您获取最后一个“中心”td 的方式:

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

得到如下结果:

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

【讨论】:

  • @John Keyes:谢谢!我假设这是 Python 切片符号。但是ppp = tds_center[3].text 不起作用的原因是什么?直观地说,因为tds_center: [3, 4 , 2.9%, $2,110,000 ] 它应该可以工作。再次感谢您的回答。
  • 好的,我明白了,但tds_center[3].text 也指最后一个元素。正确的?我错过了什么?
  • 如果您查看该表的源代码,则会有带有单个“tds”的行,例如&lt;tr&gt;&lt;td colspan="5" align="center"&gt;&lt;font face="Verdana, Arial, Helvetica, sans-serif"&gt; &lt;/font&gt;&lt;/td&gt;&lt;/tr&gt;。所以在这种情况下,tds_center 将只有一个条目,这就是引发 IndexError 的原因。
  • @John Keyes:太好了,现在我明白了。因此,或者,if len(tds_center) &gt; 2: ppp = tds_center[3].text 也可以使用。谢谢!
【解决方案2】:

回溯与代码不对应。

追溯:

ppp = tds_center[2].text

你的代码:

ppp = tds_center[0].text

您的代码的结果输出有效,但似乎不是很有趣,John Keyes 的输出更有趣,但具有 [-1] 值。 这取决于您的需求。

【讨论】:

  • 是的,你是对的 ppp = tds_center[0].text 没有给出错误;我将其更改为ppp = tds_center[2].text 以获取回溯。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-11
  • 1970-01-01
  • 2011-10-31
  • 2015-06-26
相关资源
最近更新 更多