为啥使用 BeautifulSoup find_all 方法会导致错误(列表索引超出范围)?

Posted

技术标签:

【中文标题】为啥使用 BeautifulSoup find_all 方法会导致错误(列表索引超出范围)?【英文标题】:Why use BeautifulSoup find_all method will results in an error(list index out of range)?为什么使用 BeautifulSoup find_all 方法会导致错误(列表索引超出范围)? 【发布时间】:2018-10-01 06:38:39 【问题描述】:

像这样的html

<div id="market-summary">
  ...
   <li>
     <span class="title">title1</span>
     <span class="subtitle">subtitle1</span>
   <li>
   <li>
     <span class="title">title2</span>
     <span class="subtitle">subtitle2</span>
   <li>
   <li>
     <span class="title">title1</span>
     <span class="subtitle">subtitle1</span>
   <li>
  ...
</div>

python 代码差不多是这样的:

........
if soup.select("#market-summary")[0].findAll('li'):
    prices = soup.select("#market-summary")[0].findAll('li')
    if prices is not None and len(prices) > 0:
        price = [
            'size': x.find(class_="title").get_text(),
             'price': x.find(class_="subtitle").get_text()
            for x in prices
        ]
        return price
    return 'price?'
return 'li?'
........
........

现在我开始运行这个程序正在运行的程序。控制台正在打印价格,但仅两三分钟,我收到错误消息:

'IndexError: 列表索引超出范围'

程序中断了,我一次又一次地尝试。总是'IndexError: list index out of range' 为什么没有显示“价格”?或“李?”。案例 BeautifulSoup?

【问题讨论】:

【参考方案1】:

表示你正在解析的页面没有id为market-summary的元素 如果您再次检查产生的错误,您可能会发现错误发生在第 1 行,即 if soup.select("#market-summary")[0] 或第 2 行,即 prices = soup.select("#market-summary")[0].findAll('li')

【讨论】:

如果没有#market-summary 我认为它不仅返回'li?'但程序也在继续运行,即 ` if soup.find('h1'): shop_name = soup.find('h1').get_text() return shop_name return 'not shop_name' ` if not find h1 控制台提醒me 'not shop_name',程序没有中断,仍然打印h1 text

以上是关于为啥使用 BeautifulSoup find_all 方法会导致错误(列表索引超出范围)?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 BeautifulSoup 与“从未检索到任务异常”相关?

为啥当我使用 BeautifulSoup 遍历我的文件时会得到相同的值?

为啥 Beautifulsoup 没有按名称找到这个输入?

即使元素存在,Selenium find_element 也会抛出异常

为啥使用 BeautifulSoup find_all 方法会导致错误(列表索引超出范围)?

安装BeautifulSoup库成功但是为啥导入出错