Неверный URL '': схема не указана. Возможно, вы имели в виду http: //? - Джанго - PullRequest
1 голос
/ 05 октября 2019

Я новичок в Джанго. Я делаю проект очистки данных, я создал этот код, но столкнулся с проблемой при загрузке файла CSV. Я использовал функцию «Скачать» в файле, но не получил желаемого результата. Вместо этого я получаю эту ошибку

Invalid URL '': No schema supplied. Perhaps you meant http://?

Вот мой код

views.py

def index(request):
    if request.method == "POST":

        url  = request.POST.get('url', '')

        down = request.POST.get('download','')

        r = requests.get(url)
        soup = BeautifulSoup(r.content, features="lxml")
        p_name = soup.find_all("h2",attrs={"class": "a-size-mini"})
        p_price = soup.find_all("span",attrs={"class": "a-price-whole"})
        p_image = soup.findAll('img', {'class':'s-image','src':re.compile('.jpg')})

        response = HttpResponse(content_type='text/csv')
        response['Content-Disposition'] = 'attachment; filename="product_file.csv"'


        for name,price,image in zip(p_name,p_price,p_image):
            writer = csv.writer(response)
            row = writer.writerow([name.text, price.text,image['src']])

            name_data  = [data.text for data in p_name]
            price_data = [data.text for data in p_price]
            image_data = [data['src'] for data in p_image]
            dec = {'name':name_data, 'price':price_data, 'image':image_data}



        if down:
            return response



    else:
        dec = {}
    return render(request, 'index.html',dec)

Когда я удаляю это "if down: "он загружает мой CSV-файл правильно, когда я выполняю условие if, он выдает ошибку:

Invalid URL '': No schema supplied. Perhaps you meant http://?

index.html

<div class="container">
<div class="row justify-content-md-center">
    <div class="col-md-4">
        <form method="POST" action="">{% csrf_token %}
            <h1 class="mb-3 display-4">Amazone Scraper</h1>
            <input type="text" id="url" name="url" class="form-control" placeholder="URL" required autofocus>
            <button class="mt-3 btn btn-lg btn-primary btn-block" type="submit" id="submit" name='submit'>Scrap</button>
        </form>
        <p class="mt-3"><a href="upload">Upload</a> Your File For Updates Regarding</p>
        <form action="" method="post">{% csrf_token %}<!--------download---------->
          <input class="mt-3 btn btn-info" type="submit" id="download" name='download' value='Download'/>
        </form>
    </div>
</div>
<div class="row">

1 Ответ

2 голосов
/ 05 октября 2019

Проблема в том, что у вас есть две формы, и когда вы нажимаете кнопку download, она отправляет данные из второй формы, которая не содержит поля url. Из-за этого значение url на ваш взгляд пустое. Вы должны реорганизовать это представление, чтобы использовать только одну форму.

Или вы можете попробовать добавить url поле ко второй форме и использовать url с первой в качестве значения по умолчанию:

<div class="container">
<div class="row justify-content-md-center">
    <div class="col-md-4">
        <form method="POST" action="">{% csrf_token %}
            <h1 class="mb-3 display-4">Amazone Scraper</h1>
            <input type="text" id="url" name="url" class="form-control" placeholder="URL" required autofocus>
            <button class="mt-3 btn btn-lg btn-primary btn-block" type="submit" id="submit" name='submit'>Scrap</button>
        </form>
        <p class="mt-3"><a href="upload">Upload</a> Your File For Updates Regarding</p>
        <form action="" method="post">{% csrf_token %}<!--------download---------->

Вам также необходимо добавить url в контекст шаблона:

    for name,price,image in zip(p_name,p_price,p_image):
        writer = csv.writer(response)
        row = writer.writerow([name.text, price.text,image['src']])

        name_data  = [data.text for data in p_name]
        price_data = [data.text for data in p_price]
        image_data = [data['src'] for data in p_image]
        dec = {'name':name_data, 'price':price_data, 'image':image_data, 'url': url}

Обратите внимание, что при следующей архитектуре запрос на сторонний URL будет отправлен два раза. Поэтому я полагаю, вам следует изменить вид и использовать только одну форму вместо «Записать и скачать».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...