2012-10-04 35 views
1

“IndexError列表索引超出范围”我写了解析来自某些网站的HTML代码提取特定数据的脚本。我有两个不同的网站,我从中提取这些数据,所以我使用了elif语句。以下是代码::与ELIF声明

import urllib 

class city : 
    def __init__(self, city_name, link) : 
      self.name = city_name 
      self.url = link 
      self.high0 = 0 
      self.high1 = 0 
      self.high2 = 0 
      self.high3 = 0 
      self.high4 = 0 
      self.high5 = 0 
      self.high6 = 0 
      self.low0 = 0 
      self.low1 = 0 
      self.low2 = 0 
      self.low3 = 0 
      self.low4 = 0 
      self.low5 = 0 

    def retrieveTemps(self) : 
      filehandle = urllib.urlopen(self.url) 

      # get lines from result into array 
      lines = filehandle.readlines() 

      # (for each) loop through each line in lines 
      line_number = 0 # a counter for line number 
      for line in lines: 
        line_number = line_number + 1 # increment counter 

# find string, position otherwise position is -1 

        position1 = line.rfind('#f2') 
        if position1 > 0 : 
          self.high0 = lines[line_number].split('&')[0].split('>')[1] # next line: high 
          self.low0 = lines[line_number + 10].split('&')[0].split('>')[1] # next line:low 
        elif position1 < 0 : 
          position1 = line.rfind('>Overnight') 
          if position1 > 0 : 
            self.high0 = lines[line_number + 9].split('&')[0].split(':')[1] # next line: high 
            self.low0 = lines[line_number + 15].split('&')[0].split(':')[1] # next line:low 

当position1 = line.rfind('#f2')时,该脚本完美工作。然而,当它不能找到“#F2”(这仅位于第一个站点,而不是第二的HTML代码),我想告诉它来寻找“>一夜之间”,然后提取的数据':'和'&'。 '数据'将始终是一个单一的数字。我在考虑一个问题,可能是这个数字的两边有一个空格,我试图提取,但我不知道如何解决这个问题。当我运行该脚本我得到错误:

self.high0 =行[LINE_NUMBER + 9] .split( '& ')[0] .split(':')[1]#下一行:高 “IndexError:列表索引超出范围”

作为参考,下面是HTML代码我解析用于第一网站:

</h3><img src="/weathericons/15.gif" longdesc="#f2" alt="Rain mixed with snow" title="Rain mixed with snow" /><ul> 
       <li class="high" title="High">3&deg;C</li> 
       <li class="low">&nbsp;</li> 
       <li class="pop">&nbsp;</li> 
      </ul> 
      </div> 

和从第二网站(一个针对我收到错误):

<p class="txt-ctr-caps">Overnight<br><br></p> 
      <p><img src="/images/wtf/medium/nra60.png" width="86" height="86" alt="Rain Likely Chance for Measurable Precipitation 60%" title="Rain Likely Chance for Measurable Precipitation 60%" /></p> 
     <p>Rain<br>Likely<br></p> 
      <p class="point-forecast-icons-low">Low: 3 &deg;C</p> 
    </div> 
    <div class="one-ninth-first"> 
      <p class="txt-ctr-caps">Thursday<br><br></p> 
      <p><img src="/images/wtf/medium/ra70.png" width="86" height="86" alt="Rain Likely Chance for Measurable Precipitation 70%" title="Rain Likely Chance for Measurable Precipitation 70%" /></p> 
     <p>Rain<br>Likely<br></p> 
      <p class="point-forecast-icons-high">High: 9 &deg;C</p> 
    </div> 

任何帮助将不胜感激,谢谢!

+2

请妥善格式化你的源代码,有你看看http://www.crummy.com/software/BeautifulSoup/它很容易和快速解析HTML,在没有点重新发明轮子... –

+1

我这个网站是新手,我想我已正确格式化源代码? – EverythingWX

+0

是否有你没有使用XML解析器的原因?这使得解析html比试图手动编码搜索更容易100万倍。 – ninMonkey

回答

3

现在你已经提供了完整代码: 试试这

def retrieveTemps(self) : 
     filehandle = urllib.urlopen(self.url) 
     lines = filehandle.read() # modified 

     position1 = lines.rfind('#f2') 
     if position1 > 0 : 
       self.high0 = lines[position1:].split('&')[0].split('>')[1] # next line: high 
       self.low0 = lines[position1+10:].split('&')[0].split('>')[1] # next line:low 
     elif position1 < 0 : 
       position1 = lines.rfind('>Overnight') 
       if position1 > 0 : 
         self.high0 = lines[position1+9:].split('&')[0].split(':')[1] # next line: high 
         self.low0 = lines[position1+15:].split('&')[0].split(':')[1] # next line:low 

即使是doesn'e帮助试图用基本的打印语句调试代码就像什么都在你的变量,如线和生产线,当你有正在处理。

+0

感谢您的回复。一旦我做出这一改变,我得到以下错误:AttributeError:'列表'对象没有属性'分裂' – EverythingWX

+0

好吧,行= ??在你的程序中。 我认为它粘贴 –

+1

HTML输出对不起,想我应该已经包括在我原来的职位的所有代码。我已经更新了源代码。这有帮助吗? – EverythingWX