【问题标题】:index out of range error while iterating the list items迭代列表项时出现索引超出范围错误
【发布时间】:2019-08-20 15:48:47
【问题描述】:
import requests
from bs4 import BeautifulSoup
page=requests.get('https://www.foxsports.com/golf/golfers?association=1&teamId=0&season=2019&position=0&page=1’)
soup = BeautifulSoup(page.text, 'html.parser’)
player_name_list = soup.find(class_= 'wisbb_players’)
player_name_list_items = player_name_list.findAll('a’)
for player_name in player_name_list_items:
    names = player_name.contents[1]
    print(names.text)

我不能在内容中使用 0。在打印出一个长长的空白区域后,它会在屏幕底部打印出几个数字,我认为这就是名称列表应该在的位置。

在这个网站上,每个名字都有 2 个 span 标签。很长一段时间以来,我一直试图让它只打印一个名字,当我最终得到它时,它给了我一个错误。我不知道还能说什么。我一直在尝试发布这个大约 30 分钟。如果这篇文章中的某些内容有问题,请告诉我。我只是想在这里提出我的问题。

【问题讨论】:

    标签: python web-scraping beautifulsoup python-requests indexoutofrangeexception


    【解决方案1】:

    您收到错误消息,因为 player_name_list_items 的最后四个元素不是玩家姓名。所以如果你检查player_name.contents,你只会得到['2'],因为这个列表只有一个元素,当它试图做player_name.contents[1]时,你会得到一个超出范围的错误。要绕过它,您可以使用 if 语句:

    试试这个:

    for player_name in player_name_list_items:
        if player_name.span:
            print(player_name.span.text)
        else:
            print('Not a name')
    

    输出:

    Adamonis, Brad
    Adams, Frank
    Albertson, Anders
    Allan, Stephen
    Allenby, James
    Allenby, Robert
    Alverio, Max
    An, Byeong Hun
    Ancer, Abraham
    Anderson, Mark
    Anderson, Matthew
    Anguiano, Mark
    Aphibarnrat, Kiradech
    Appleby, Stuart
    Arendell, Connor
    Armour, Ryan
    Armstrong, Dawson
    Arnaus, Adri
    Asaji, Yosuke
    Ashun, Wu
    Atwal, Arjun
    Augenstein, John
    Axley, Eric
    Baddeley, Aaron
    Bae, Sang-Moon
    Not a name
    Not a name
    Not a name
    Not a name
    

    【讨论】:

      【解决方案2】:

      更正您的选择器以仅检索第一个子跨度,即第一个玩家姓名出现

      import requests
      from bs4 import BeautifulSoup as bs
      
      r = requests.get('https://www.foxsports.com/golf/golfers?association=1&teamId=0&season=2019&position=0&page=1')
      soup = bs(r.content, 'lxml')
      #bs4 4.7.1 +
      players = [i.text for i in soup.select('.wisbb_fullPlayer > span:first-child')]
      #or < 4.7.1
      players = [i.text for i in soup.select('.wisbb_fullPlayer > span:nth-of-type(1)')]
      print(players)
      

      【讨论】:

      • 这给了我这个 NotImplementedError Traceback(最近一次调用最后一次) in ----> 1 个玩家 = [i.text for i in soup. select('.wisbb_fullPlayer > span:first-child')] NotImplementedError:仅实现了以下伪类:nth-​​of-type。
      • 需要 bs4 4.7.1 + 。值得升级,因为它支持功能,我相信更准确。
      • 如果你不想升级使用:players = [i.text for i in soup.select('.wisbb_fullPlayer > span:nth-of-type(1)')]跨度>
      猜你喜欢
      • 2018-01-30
      • 2010-12-20
      • 1970-01-01
      • 2019-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-30
      相关资源
      最近更新 更多