IndexError:使用beautifulsoup 抓取广告时列出的索引超出范围

Posted

技术标签:

【中文标题】IndexError:使用beautifulsoup 抓取广告时列出的索引超出范围【英文标题】:IndexError: list index out of range while webscraping advertisements with beautifulsoup 【发布时间】:2019-09-08 02:30:38 【问题描述】:

我正在本地网站上搜索公寓购买/租赁广告。

在某些情况下,我收到 IndexError: list index out of range 错误。

当我的抓取工具遇到没有某些参数的添加时,我收到错误消息。通常是 Powierzchnia(大小)、Liczba pokoi(房间数量)、Pietro(楼层)、Rok budowy(建造年份 - 我没有刮)

我想是因为这个:

pietro = ogl.find_all('p', class_ ="list__item__details__icons__element__desc")[2].text 

如果没有 [2] ,通常是第三个参数,它会抛出这个 [2] 超出范围的错误。

我试图将 if 放入 for 循环中,它会检查是否有这样的参数,如果没有,继续。然而无法通过它。

我也试过这样使用:

Powierzchnia = zrzut.find_all('li', class_ = "list__item__details__icons__element details--icons--element--powierzchnia")[0].text

这个没有抛出错误,但给所有的广告提供了相同的大小

完整代码如下:

from bs4 import BeautifulSoup
from requests import get
import pandas as pd
import itertools
import matplotlib.pyplot as plt


headers = ('User-Agent':
            'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (Khtml, like Gecko) Chrome/41.0.2228.0 Safari/537.36')
link = 'https://ogloszenia.trojmiasto.pl/nieruchomosci/wi,100,dw,1d.html?' + str(strona)
r = get(link, headers = headers)
zupa = BeautifulSoup(r.text, 'html.parser')

ogloszenia= zupa.find_all('div', class_="list__item")

n_stron = 0
numer = 0
for strona in range(0,12):
    n_stron +=1
    for ogl in ogloszenia:
        tytul = ogl.find_all('h2', class_ ="list__item__content__title")[0].text
        powierzchnia = ogl.find_all('p', class_ ="list__item__details__icons__element__desc")[0].text
        liczba_pokoi = ogl.find_all('p', class_ ="list__item__details__icons__element__desc")[1].text
        pietro = ogl.find_all('p', class_ ="list__item__details__icons__element__desc")[2].text
        lokalizacja = ogl.find_all('p', class_ = "list__item__content__subtitle")[0].text
        cena = ogl.find_all('p', class_ = "list__item__price__value")[0].text
        cena_m = ogl.find_all('p', class_ = "list__item__details__info details--info--price")[0].text

        numer += 1
        print(numer)
        print(tytul)
        print('Powierzchnia: ' + powierzchnia )
        print('Lokalizacja: ' + lokalizacja )
        print('Liczba pokoi: ' + liczba_pokoi )
        print('Pietro: ' + pietro )
        print('Cena: ' + cena )
        print('Cena za metr kwadratowy: ' + cena_m +'\n')

【问题讨论】:

【参考方案1】:

您可以捕获IndexError 异常并将变量设置为None''

try:
    powierzchnia = ogl.find_all('p', class_ ="list__item__details__icons__element__desc")[0].text
except IndexError:
    powierzchnia = ''

对于其他变量,您也可能会遇到这种情况。只需对每个重复相同的操作即可。

【讨论】:

这正是我想要的!非常感谢!【参考方案2】:

试试:

data = ogl.find_all('p', class_ ="list__item__details__icons__element__desc")
for idx,entry in enumerate(data):
    if idx == 0:
        print('powierzchnia '.format(entry.text))
    elif idx == 1:
        print('liczba_pokoi '.format(entry.text))
    else:
        print('pietro '.format(entry.text))

【讨论】:

【参考方案3】:

我会推荐两个更改。

首先,尝试隔离函数中的重复命令。

def findDetail(ogl, tag, class, index):
     return ogl.find_all(tag, class_ = class)[index].text

然后,在索引不可用的情况下,您可以使用“try-except”来处理它。这是在 Python 中处理错误的标准方法:

def findDetail(ogl, tag, class, index):
    try:
        return ogl.find_all(tag, class_ = class)[index].text
    except IndexError:
        print(f”Could not find index index for tag with class”)
        return “”

然后调用它:

for ogl in ogloszenia:
    tytul = findDetail(ogl, “h2”, “"list__item__content__title", 0)
    powierzchnia = findDetail(ogl, ‘p’, "list__item__details__icons__element__desc", 0)

等等。如果找不到索引,那么它只会打印一个空白字符串。

【讨论】:

以上是关于IndexError:使用beautifulsoup 抓取广告时列出的索引超出范围的主要内容,如果未能解决你的问题,请参考以下文章

IndexError:在pyspark shell上使用reduceByKey操作时列出索引超出范围

IndexError:使用 py2exe 时元组索引超出范围

应用 pandas udf 后无法使用 .toPandas() 或 .collect():IndexError

IndexError - 使用Python 3.4.3

为啥在尝试获取数据分析报告时会出现 IndexError?

IndexError:使用 scikit-learn 绘制 ROC 曲线时数组索引过多?