保存为PDF时出现Web抓取FileNotFoundError

时间:2018-12-14 14:04:06

标签: python python-3.x web-scraping

我复制了一些Python代码,以便从网站下载数据。这是我的特定网站: https://www.codot.gov/business/bidding/bid-tab-archives/bid-tabs-2017-1

这是我复制的代码:

import requests
from bs4 import BeautifulSoup

def _getUrls_(res):
    hrefs = []
    soup = BeautifulSoup(res.text, 'lxml')
    main_content = soup.find('div',{'id' : 'content-core'})
    table = main_content.find("table")
    for a in table.findAll('a', href=True):
        hrefs.append(a['href'])
    return(hrefs)

bidurl = 'https://www.codot.gov/business/bidding/bid-tab-archives/bid-tabs-2017-1'
r = requests.get(bidurl)
hrefs = _getUrls_(r)

def _getPdfs_(hrefs, basedir):
    for i in range(len(hrefs)):
        print(hrefs[i])
        respdf = requests.get(hrefs[i])
        pdffile = basedir + "/pdf_dot/" + hrefs[i].split("/")[-1] + ".pdf"
        try:
            with open(pdffile, 'wb') as p:
                p.write(respdf.content)
                p.close()
        except FileNotFoundError:
            print("No PDF produced")

basedir= "/Users/ABC/Desktop"
_getPdfs_(hrefs, basedir)

代码成功运行,但是即使显然没有Filenotfounderror,它也没有下载任何东西。

我尝试了以下两个URL:

https://www.codot.gov/business/bidding/bid-tab-archives/bid-tabs-2017/aqc-088a-035-20360
https://www.codot.gov/business/bidding/bid-tab-archives/bid-tabs-2017/aqc-r100-258-21125

但是,这两个URL均返回>>> No PDF produced

问题是该代码对其他人(而不对我)有效并且可以成功下载。

4 个答案:

答案 0 :(得分:5)

您刚才测试的代码有效。您需要确保basedir存在,要将其添加到代码中:

if not os.path.exists(basedir):
    os.makedirs(basedir)

答案 1 :(得分:4)

我使用了这个精确的代码(缩进的),但是用我自己的dir替换了basedir,并且只有在我确定路径确实存在后,它才起作用。如果该文件夹不存在,则此代码不会创建该文件夹。

答案 2 :(得分:1)

正如其他人指出的那样,您需要预先创建basedir。运行脚本的用户可能没有创建目录。确保在脚本的开头,主逻辑之前插入此代码。

此外,将脚本传输到不同系统时,对基本目录进行硬编码可能不是一个好主意。最好使用用户%USERPROFILE%环境变量:

from os import envioron
basedir= join(environ["USERPROFILE"], "Desktop", "pdf_dot")

C:\Users\blah\Desktop\pdf_dot相同。

但是,上面的enovorment变量仅适用于Windows。如果您希望它在Linux上运行,则必须改为使用os.environ["HOME"]

如果需要在两个系统之间进行传输,则可以使用os.name

from os import name
from os import environ

# Windows
if name == 'nt':
    basedir= join(environ["USERPROFILE"], "Desktop", "pdf_dot")

# Linux
elif name == 'posix':
    basedir = join(environ["HOME"], "Desktop", "pdf_dot")

答案 3 :(得分:0)

您无需指定目录或手动创建任何文件夹。您需要做的就是运行以下脚本。执行完成后,您应该在桌面上找到一个名为pdf_dot的文件夹,其中包含您希望获取的pdf文件。

import requests
from bs4 import BeautifulSoup
import os

URL = 'https://www.codot.gov/business/bidding/bid-tab-archives/bid-tabs-2017-1'

dirf = os.environ['USERPROFILE'] + '\Desktop\pdf_dot'
if not os.path.exists(dirf):os.makedirs(dirf)
os.chdir(dirf)

res = requests.get(URL)
soup = BeautifulSoup(res.text, 'lxml')
pdflinks = [itemlink['href'] for itemlink in soup.find_all("a",{"data-linktype":"internal"}) if "reject" not in itemlink['href']]
for pdflink in pdflinks:
    filename = f'{pdflink.split("/")[-1]}{".pdf"}'
    with open(filename, 'wb') as f:
        f.write(requests.get(pdflink).content)