Python3。如何将下载的网页保存到指定目录?
Python3. How to save downloaded webpages to a specified dir?
我正在尝试将 python 主页中的所有 链接保存到名为 'Downloaded pages' 的文件夹中。但是,在 for 循环进行 2 次迭代后,我收到以下错误:
www.python.org#content <_io.BufferedWriter name='Downloaded
Pages/www.python.org#content'> www.python.org#python-network
<_io.BufferedWriter name='Downloaded
Pages/www.python.org#python-network'>
Traceback (most recent call last): File "/Users/Lucas/Python/AP book
exercise/Web Scraping/linkVerification.py", line 26, in
downloadedPage = open(os.path.join('Downloaded Pages', os.path.basename(linkUrlToOpen)), 'wb') IsADirectoryError: [Errno 21]
Is a directory: 'Downloaded Pages/'
我不确定为什么会发生这种情况,因为页面似乎是由于看到“<_io.BufferedWriter name='Downloaded Pages/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/” 基本名称实际上是空的(您可以尝试先打印 url 然后是括号之间的基本名称或其他内容以了解我的意思) .因此,要解决这个问题,最简单的解决方案是使用@Thyebri 所说的绝对路径。
另外,请记住,您编写的文件不能包含 '/', '\' or '?'
这样的字符
所以,我不知道下面的代码是否混乱,但是使用 re
库我会执行以下操作:
filename = re.sub('[\/*:"?]+', '-', linkUrlToOpen.split("://")[1])
downloadedPage = open(os.path.join('Downloaded_Pages', filename), 'wb')
所以,首先我删除部分我删除 "https://"
部分,然后使用正则表达式库我将 url 链接中出现的所有常用符号替换为破折号 '-'
,这就是文件的名称。
希望有用!
我正在尝试将 python 主页中的所有 链接保存到名为 'Downloaded pages' 的文件夹中。但是,在 for 循环进行 2 次迭代后,我收到以下错误:
www.python.org#content <_io.BufferedWriter name='Downloaded Pages/www.python.org#content'> www.python.org#python-network <_io.BufferedWriter name='Downloaded Pages/www.python.org#python-network'>
Traceback (most recent call last): File "/Users/Lucas/Python/AP book exercise/Web Scraping/linkVerification.py", line 26, in downloadedPage = open(os.path.join('Downloaded Pages', os.path.basename(linkUrlToOpen)), 'wb') IsADirectoryError: [Errno 21] Is a directory: 'Downloaded Pages/'
我不确定为什么会发生这种情况,因为页面似乎是由于看到“<_io.BufferedWriter name='Downloaded Pages/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/” 基本名称实际上是空的(您可以尝试先打印 url 然后是括号之间的基本名称或其他内容以了解我的意思) .因此,要解决这个问题,最简单的解决方案是使用@Thyebri 所说的绝对路径。
另外,请记住,您编写的文件不能包含 '/', '\' or '?'
所以,我不知道下面的代码是否混乱,但是使用 re
库我会执行以下操作:
filename = re.sub('[\/*:"?]+', '-', linkUrlToOpen.split("://")[1])
downloadedPage = open(os.path.join('Downloaded_Pages', filename), 'wb')
所以,首先我删除部分我删除 "https://"
部分,然后使用正则表达式库我将 url 链接中出现的所有常用符号替换为破折号 '-'
,这就是文件的名称。
希望有用!