【问题标题】:Invalid URL '': No schema supplied. Perhaps you meant http://? - Django无效的 URL '':未提供架构。也许你的意思是 http://? - 姜戈
【发布时间】:2019-10-05 04:36:28
【问题描述】:

我是 Django 的初学者。我正在制作一个数据抓取项目,我已经制作了这段代码,但在下载 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">

【问题讨论】:

    标签: django python-3.x


    【解决方案1】:

    问题是您有两个表单,当您单击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 的以下架构请求将被发送两次。所以我想你应该重构视图并只使用一种形式而不是“Scrape and download”。

    【讨论】:

      猜你喜欢
      • 2021-05-05
      • 1970-01-01
      • 1970-01-01
      • 2019-10-30
      • 2010-10-03
      • 2022-01-23
      • 2018-06-02
      • 1970-01-01
      • 2022-07-21
      相关资源
      最近更新 更多