Erro na função enumerate

Olá. Eu estou aprendendo Python, e resolvi fazer um projetinho utilizando o que eu aprendi. A Ideia é simples, procurar em uma página WEB links para arquivos (que estejam dentre as extensões passadas pelo usuário), e então baixe os mesmos. Porém eu não consegui testar minha aplicação por causa de um arro.
Meu código é esse:

#! /usr/bin/python
# coding: utf-8
#By: Thallysson Klein Flor

import io
import sys
import urllib.request as request
from bs4 import BaultifulSoup
import requests

class Main:
    def download(response, output):
        total_downloaded = 0
        while True:
            data = response.read(1024)
            total_downloaded += len(data)
            if not data:
                break;
            out_file.write(data)
            print("Baixados {bytes}".format(bytes=total_downloaded))

def main ():
    for url in sys.argv:
        page = requests.get(url)
        soup = BeaultifulSoup(page.content,"html.parser")
        images = soup.find_all('img')
        videos = soup.find_all ('video')
        audios = soup.find_all ('audio')
        links = soup.find_all ('a')
        tipo = raw_input ('Que arquivos você deseja baixar?')
        print ("Digite o NOME das extensões dos arquivos que você deseja baixar (separadas por uma , )")
        tipos = tipo.split(",")
        for t in tipo:
             for index, img in imagens enumerate(imagens):
                src = img [ ' src ' ]
                if src.contains ('http') and src.contains(t):
                        response = request.urlopen (src)
                    out_file = io.FileIO ("IMG {}".format ( index), mode="w")
                    download (response, out_file)
                    response.close ()
                    out_file.close ()
             for index, v in videos enumerate(videos):
                src = v [ ' src ' ]
                if src.contains ('http') and src.contains(t):
                        response = request.urlopen (src)
                    out_file = io.FileIO ("Video {}".format ( index), mode="w")
                    download (response, out_file)
                    response.close ()
                    out_file.close ()
            for index, a in audios enumerate(audios):
                src = a [ ' src ' ]
                if src.contains ('http') and src.contains(t):
                        response = request.urlopen (src)
                    out_file = io.FileIO ("Audio {}".format ( index), mode="w")
                    download (response, out_file)
                    response.close ()
                    out_file.close ()   
            for index, link in links enumerate(links):
                src = link [ ' src ' ]
                if src.contains ('http') and src.contains(t):
                        response = request.urlopen (src)
                    out_file = io.FileIO ("Arquivo {}".format ( index), mode="w")
                    download (response, out_file)
                    response.close ()
                    out_file.close ()
    if __name__ == "__main__":
        main()

Está dando erro de “invalid sintax” em todas as funções enumerate de todos os loops. Alguém sabe me dizer o que eu fiz de errado?

Tente isso:

for index, img in enumerate(imagens):
for index, v in enumerate(videos):
for index, a in enumerate(audios):
for index, link in enumerate(links):
1 curtida

Muito obrigado. Parou de apresentar o erro, meu código ficou assim:
#! /usr/bin/python
# coding: utf-8
#By: Thallysson Klein Flor

import io
import sys
import urllib.request as request
from bs4 import BaultifulSoup
import requests

class Main:
def download(response, output):
    total_downloaded = 0
    while True:
        data = response.read(1024)
        total_downloaded += len(data)
        if not data:
            break;
        out_file.write(data)
        print("Baixados {bytes}".format(bytes=total_downloaded))

def main ():
for url in sys.argv:
    page = requests.get(url)
    soup = BeaultifulSoup(page.content,"html.parser")
    images = soup.find_all('img')
    videos = soup.find_all ('video')
    audios = soup.find_all ('audio')
    links = soup.find_all ('a')
    tipo = raw_input ('Que arquivos você deseja baixar?')
    print ("Digite o NOME das extensões dos arquivos que você deseja baixar (separadas por uma , )")
    tipos = tipo.split(",")
    for t in tipo:
         for index, img in enumerate(imagens):
            src = img [ ' src ' ]
            if src.contains ('http') and src.contains(t):
                response = request.urlopen (src)
                out_file = io.FileIO ("IMG {}".format ( index), mode="w")
                download (response, out_file)
                response.close ()
                out_file.close ()
         for index, v in enumerate(videos):
            src = v [ ' src ' ]
            if src.contains ('http') and src.contains(t):
                response = request.urlopen (src)
                out_file = io.FileIO ("Video {}".format ( index), mode="w")
                download (response, out_file)
                response.close ()
                out_file.close ()
         for index, a in enumerate(audios):
            src = a [ ' src ' ]
            if src.contains ('http') and src.contains(t):
                response = request.urlopen (src)
                out_file = io.FileIO ("Audio {}".format ( index), mode="w")
                download (response, out_file)
                response.close ()
                out_file.close ()   
         for index, link in enumerate(links):
            src = link [ ' src ' ]
            if src.contains ('http') and src.contains(t):
                response = request.urlopen (src)
                out_file = io.FileIO ("Arquivo {}".format ( index), mode="w")
                download (response, out_file)
                response.close ()
                out_file.close ()
if __name__ == "__main__":
    main()

Porém agora está sendo apresentado o seguinte erro: ModuleNotFoundError: No module named 'bs4’
Você sabe me dizer o que eu fiz de errado?

Algum conflito na instalação do módulo bs4

Como você instalou esse módulo?

Talvez terá de reinstalá-lo…

Perdão pela minha ignorância. Mas como assim instalar? Não é só importar?

Não, nem tudo o que se importa pertence/existe nativamente no python, é necessário instalação do módulo, como naquele exemplo do wpa que te mostrei lembra?

Se você observou bem a página, tinha um comando parecido com

pip install wpa_supplicant

Ou seja, ouve a instalação do módulo para depois sim a importação… são coisas distintas

O python tem uma fama de “baterias inclusas”, mas isso não quer dizer que vai ter tudo o que você deseja…

Vai se acostumando a usar o pip (gerenciador de dependências do python), pra instalar os módulos e “extender” o python conforme sua necessidade…

https://pypi.python.org/pypi/beautifulsoup4

Se estiver usando linux, use o seguinte comando no terminal:

 pip list

Isso vai te mostrar todos os módulos instalados, verá que o bs4 não consta, bem legal esse carinha!

É, eu escrevi um programa com aquele exemplo do WPA que você me mostrou, porém eu não tive a chance de executa-lo porque migrei de sistema operacional e tive uma grande manutenção. Como eu ainda não testei, eu não sabia disso.

Bem, eu segui o link, e instalei no meu PC. Só pra avisar, eu uso Windows 10.

Porém agora está sendo apresentado o seguinte erro:

Traceback (most recent call last):
  File "C:\Users\thall\Desktop\baixarArquivos.py", line 8, in <module>
from bs4 import BaultifulSoup
ImportError: cannot import name 'BaultifulSoup'

Classe não está escrita errado?

from bs4 import BaultifulSoup

Não seria BeautifulSoup?

É realmente, foi um erro grotesco. Porém agora está sendo apresentado o seguinte erro:
ModuleNotFoundError: No module named 'requests'
Porém eu já instalei o módulo requests, urllib3 e chardet2.

Veja se ajuda

1 curtida

Consegui instalar e meus problemas com este módulo acabaram, pesso perdão novamente pela minha ignorância, eu vi esse exemplo com o requests em um PDF, porém está apresentando o seguinte erro pra mim:

    Traceback (most recent call last):
  File "C:\Users\thall\Desktop\baixarArquivos.py", line 67, in <module>
    main()
  File "C:\Users\thall\Desktop\baixarArquivos.py", line 24, in main
    page = requests.get(url) 
  File "C:\Users\thall\AppData\Local\Programs\Python\Python36\lib\site-packages\requests\api.py", line 70, in get
    return request('get', url, params=params, **kwargs)
  File "C:\Users\thall\AppData\Local\Programs\Python\Python36\lib\site-packages\requests\api.py", line 56, in request
   return session.request(method=method, url=url, **kwargs)
  File "C:\Users\thall\AppData\Local\Programs\Python\Python36\lib\site-packages\requests\sessions.py", line 488, in request
    resp = self.send(prep, **send_kwargs)
  File "C:\Users\thall\AppData\Local\Programs\Python\Python36\lib\site-packages\requests\sessions.py", line 603, in send
    adapter = self.get_adapter(url=request.url)
  File "C:\Users\thall\AppData\Local\Programs\Python\Python36\lib\site-    packages\requests\sessions.py", line 685, in get_adapter
    raise InvalidSchema("No connection adapters were found for '%s'" % url)
requests.exceptions.InvalidSchema: No connection adapters were found for     'C:\Users\thall\Desktop\baixarArquivos.py'

Sabe me dizer o que eu fiz de errado? Eu fiz igual ao exemplo que eu vi.

Ao que parece a exceção começa a ser lançada justo aqui…

page = requests.get(url)

A url informada/buscada tem o protocolo http na frente?

Valide antes de usar a url, pode tentar assim…

if url.find('http://') == -1:
    url = "http://" + url 

page = requests.get(url)

Mas eu estou inserindo URLs com http na frente, porém o erro persiste.

Eu descobri o motivo do erro. A primeira posição do sys.argv não é o primeiro parâmetro e sim o nome do arquivo. Depois de corrigir esse e vários outros bugs que apareceram, meu código ficou assim:

#! /usr/bin/python
# coding: utf-8
#By: Thallysson Klein Flor

import io
import sys
import urllib.request as request
from bs4 import BeautifulSoup
import requests
from hurry.filesize import size

class Main:
    def main ():
        def download(response, output, url):
            print("Baixando o arquivo {}".format(url))
            total_downloaded = 0
            while True:
                data = response.read(1024)
                total_downloaded += len(data)
                if not data:
                    break;
                out_file.write(data)
                print("Baixados {bytes}".format(bytes=size(total_downloaded)), end="\r")
            print("\nFinalizado")
                
        for index, url in enumerate(sys.argv):
            if index > 0:
                page = requests.get(url)
                soup = BeautifulSoup(page.content,"html.parser")
                images = soup.find_all('img')
                videos = soup.find_all ('video')
                audios = soup.find_all ('audio')
                links = soup.find_all ('a')
                tipo = input ('Digite o nome das extensões (com o ".") dos arquivos que você deseja baixar (separadas por uma , ) ')
                tipos = tipo.split(",")
                for t in tipos:
                    print(t)
                    for index, img in enumerate(images):
                        src = img [ 'src' ]
                        if "http" in src and t in src:
                            response = request.urlopen (src)
                            out_file = io.FileIO ("IMG {}{}".format(index,t), mode="w")
                            download (response, out_file, src)
                            response.close ()
                            out_file.close ()
                    for index, v in enumerate(videos):
                        try:
                            src = v [ 'src' ]
                        except:
                            children = v.findChildren()
                            for child in children:
                                if child.name == "source":
                                    src = child[ 'src' ]
                                    break
                        if "http" in src and t in src:
                            response = request.urlopen (src)
                            out_file = io.FileIO ("Video {}{}".format(index,t), mode="w")
                            download (response, out_file, src)
                            response.close ()
                            out_file.close ()
                    for index, a in enumerate(audios):
                        src = a [ 'src' ]
                        if "http" in src and t in src:
                            response = request.urlopen (src)
                            out_file = io.FileIO ("Audio {}{}".format(index,t), mode="w")
                            download (response, out_file, src)
                            response.close ()
                            out_file.close ()   
                    for index, link in enumerate(links):
                        print(link)
                        try:
                            src = link [ 'href' ]
                            if "http" in src and t in src:
                                response = request.urlopen (src)
                                out_file = io.FileIO ("Arquivo {}{}".format(index,t), mode="w")
                                download (response, out_file, src)
                                response.close ()
                                out_file.close ()
                        except:
                            print("Link sem arquivo")
    if __name__ == "__main__":
        main()

Está tudo funcionando corretamente.