Python3.如何保存下载的网页到指定的目录?



我试图保存所有的<一个比;链接到一个名为"已下载页面"的文件夹中。然而,经过2次for循环迭代后,我收到以下错误:>

www.python.org内容& lt; _io。BufferedWriter name = '下载页面/www.python.org内容的祝辞www.python.org python-network& lt; _io。BufferedWriter name = '下载页面/www.python.org python-network的祝辞

Traceback(最近一次调用):File "/Users/Lucas/Python/AP book. exercise/Web Scraping/linkVerification.py",第26行下载页面=打开os.path。join('已下载的页面',os.path.basename(linkUrlToOpen)), 'wb') IsADirectoryError: [Errno 21]是一个目录:' downloads Pages/'

我不确定为什么会发生这种情况,因为页面似乎由于看到'<_io而被保存。BufferedWriter name='已下载的页面/www.python.org#content'>',这告诉我这是正确的路径。

这是我的代码:

import requests, os, bs4
# Create a new folder to download webpages to
os.makedirs('Downloaded Pages', exist_ok=True)
# Download webpage
url = 'https://www.python.org/'
res = requests.get(url)
res.raise_for_status() # Check if the download was successful
soupObj = bs4.BeautifulSoup(res.text, 'html.parser') # Collects all text form the webpage
# Find all 'a' links on the webpage
linkElem = soupObj.select('a')
numOfLinks = len(linkElem)
for i in range(numOfLinks):
linkUrlToOpen = 'https://www.python.org' + linkElem[i].get('href')
print(os.path.basename(linkUrlToOpen))
# save each downloaded page to the 'Downloaded pages' folder
downloadedPage = open(os.path.join('Downloaded Pages', os.path.basename(linkUrlToOpen)), 'wb')
print(downloadedPage)
if linkElem == []:
print('Error, link does not work')
else:
for chunk in res.iter_content(100000):
downloadedPage.write(chunk)
downloadedPage.close()

感谢您的建议,谢谢。

问题是,当你试图做的事情,如解析一个页面的。html目录的基本名称,它的工作,但当你试图做一个没有指定它的url,如"http://python.org/"basename实际上是空的(您可以尝试先打印url,然后在括号或其他东西之间打印basename,以了解我的意思)。因此,为了解决这个问题,最简单的解决方案是使用绝对路径,就像@Thyebri所说的那样。

还要记住,你写的文件不能包含像'/', '' or '?'

这样的字符所以,我不知道下面的代码是否混乱,但使用re库我会做以下操作:

filename = re.sub('[/*:"?]+', '-', linkUrlToOpen.split("://")[1])
downloadedPage = open(os.path.join('Downloaded_Pages', filename), 'wb')

所以,首先我删除部分i删除"https://"部分,然后用正则表达式库我用破折号'-'替换url链接中存在的所有常用符号,这是将给予文件的名称。

希望它能起作用!

最新更新