1
votes

Python - Index de liste hors limites -

J'ai trouvé un script pour Program pour créer un robot d'exploration ciblé en Python. Ce script s'est arrêté dans la fonction (google_scrape). dans cette fonction, j'ai eu une erreur à chaque exécution. Cette erreur est (List Index Out Of Range) Pouvez-vous m'aider?

# Uses google search engine to find out the results for user query. 
def google_scrape(query):
    address = "http://www.google.com/search?q=%s&num=100&hl=en&start=0" % (urllib.quote_plus(query))
    request = urllib2.Request(address, None, {'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_4) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11'})
    urlfile = urllib2.urlopen(request)   
    page = urlfile.read()
    soup = BeautifulSoup(page)
    links = []
    count = 0
    li = soup.findAll('li', attrs={'class':'g'})
    while count < 10:
        sLink = li[count].find('a')
        links.append(sLink['href']) 
        count += 1
    return links

Pile d'erreurs: entrez la description de l'image ici


2 commentaires

Astuce: pendant que compte <10: c'est louche


Vous pouvez définir le nombre maximum de résultats avec limite . Ensuite, parcourez les résultats sans utiliser d'index.


3 Réponses :


0
votes

Vous pourriez avoir moins de 10 liens, essayez:

for count in range(len(li)):
    sLink = li[count].find('a')
    links.append(sLink['href']) 
    count += 1

Votre code fonctionnera dans le cas où li a plus de 10 éléments, mais vous donnera une erreur quand il aura moins de 10 éléments car vous allez essayer d'accéder à un élément en dehors de la liste, ce qui donne l'erreur d'index. Avec un pour et un range (len (li)) vous pouvez boucler uniquement sur tous les éléments indépendamment de la longueur de la liste, évitant ainsi l'erreur d'index.


0 commentaires

0
votes

Utilisation de L'argument limite code > :

li = soup.findAll('li', attrs={'class':'g'}, limit=10)

for elem in li:
    sLink = elem.find('a')
    links.append(sLink['href'])
    count += 1


0 commentaires

0
votes

Vous pouvez rassembler tout et tester la longueur de la liste renvoyée, puis découper la liste en conséquence

items = [item['href'] for item in soup.select('li.g a')]
length = len(items)
if length < 10:
    final = items[:length + 1]
else:
    final = items[:10]


0 commentaires