我复制了一些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
。
问题是该代码对其他人(而不对我)有效并且可以成功下载。
答案 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)