为什么这个python脚本会抛出一个;FileNotFoundError";文件何时确实存在?

为什么这个python脚本会抛出一个;FileNotFoundError";文件何时确实存在?,python,web-scraping,beautifulsoup,Python,Web Scraping,Beautifulsoup,因此,我有一个简单的抓取脚本,它基本上从github repo中抓取一个书籍/标记标题列表,然后为每个书籍标题创建相应的目录,然后它抓取章节标题和指向这些书籍的章节标记文件的链接。但在脚本“触及”第一章标题后,我遇到了“FileNotFoundError”。我看到已经创建了第一个文件,但是当脚本调用章节标题上的open()函数时,它抛出一个错误,表示找不到这样的文件或目录。我确保脚本在正确的目录下工作,并且被传递到文件的相对路径,并且文件权限是适当的。我在python虚拟环境中运行这个脚本,所以

因此,我有一个简单的抓取脚本,它基本上从github repo中抓取一个书籍/标记标题列表,然后为每个书籍标题创建相应的目录,然后它抓取章节标题和指向这些书籍的章节标记文件的链接。但在脚本“触及”第一章标题后,我遇到了“FileNotFoundError”。我看到已经创建了第一个文件,但是当脚本调用章节标题上的open()函数时,它抛出一个错误,表示找不到这样的文件或目录。我确保脚本在正确的目录下工作,并且被传递到文件的相对路径,并且文件权限是适当的。我在python虚拟环境中运行这个脚本,所以这可能是一些未定义的行为。异常在第行抛出

#!/usr/bin/env python

from bs4 import BeautifulSoup
import re
import requests
import subprocess
import os

r = requests.get('https://github.com/getify/You-Dont-Know-JS/blob/1st-ed/README.md')

page = BeautifulSoup(r.text)
article_container = page.find('article', class_="markdown-body")
unordered_list = article_container.find('ul')
lists = unordered_list.find_all('li')

dict_of_books = {}


for li_element in lists:
    rel_path = li_element.find('a').get('href') 
    abs_path = 'https://github.com' + rel_path
    title = li_element.find('a').get_text().strip('\"')
    dict_of_books[title] = abs_path

for k,v in dict_of_books.items():
    os.mkdir(k)
    os.chdir(k)
    path = os.getcwd()
    ch_r = requests.get(v)
    new_r = BeautifulSoup(ch_r.text) 
    chapter_titles_and_links = {}
    chapter_titles_and_links = { link.find('a').get_text().strip('\"'): link.find('a').get('href') for link in new_r.find('article', class_="markdown-body").find('ul').find_all('li')}
    for title,link in chapter_titles_and_links.items():
        p = subprocess.Popen(['touch', title])
        with open(os.path.join(path,title), 'w+') as chapter:
            ch_file = requests.get('https://github.com' + link)
            chapter.write(ch_file.text)

    os.chdir('..')
这是我得到的第一个例外

  new_r = BeautifulSoup(ch_r.text)
Traceback (most recent call last):
  File "./ydkjs_scraper.py", line 56, in <module>
    chapter = open(os.path.join(path,title), 'r+')
FileNotFoundError: [Errno 2] No such file or directory: '/home/r2t2/Documents/it docs/youdontknowjsvenv/Up & Going/Foreword'
new\u r=beautifulsou(chu r.text)
回溯(最近一次呼叫最后一次):
文件“/ydkjs_scraper.py”,第56行,在
chapter=open(os.path.join(path,title),'r+')
FileNotFoundError:[Errno 2]没有这样的文件或目录:'/home/r2t2/Documents/it docs/youdontknowjsvenv/Up&go/Foreword'
也许有人可以尝试在他们自己的虚拟环境中运行此脚本来重现异常。谢谢

编辑: 根据Alexander Cecile的建议,在编辑使用文件上下文管理器之后,我能够为第一本书/目录及其章节运行脚本,但随后脚本超时,现在抛出下面的异常

requests.exceptions.ConnectionError: HTTPSConnectionPool(host='github.comhttps', port=443): Max retries exceeded with url: //shanehudson.net/2014/06/03/foreword-dont-know-js/ (Caused by NewConnectionError('<urllib3.connection.VerifiedHTTPSConnection object at 0x7fc41117eef0>: Failed to establish a new connection: [Errno 110] Connection timed out',))
requests.exceptions.ConnectionError:HTTPSConnectionPool(host='github.comhttps',port=443):url://shanehudson.net/2014/06/03/foreword-not-know-js/超过最大重试次数(由NewConnectionError引起(“:未能建立新连接:[Errno 110]连接超时,”)

一旦我更改了session.get(),我将按照另一个线程中的某人的建议进行编辑

总是用来处理文件,它们非常有用!对于每个循环迭代,您似乎都要打开和关闭同一个文件。我将尽快生成重构版本。感谢您的快速响应。因此,我使用了上下文管理器,但仍然遇到了相同的问题。然后,我将文件处理的模式从“r+”更改为“w+”,这使事情得以顺利进行。该脚本适用于第一本书,但脚本超时,并出现超时请求异常。我猜GitHub正试图限制或阻止他们网站上长时间运行的抓取。我刚刚遇到另一个线程,它提到使用session.get(),所以我会尝试一下。很好,再次期待您的答案,非常感谢。您可以编辑您的帖子以包含更改吗?我很高兴您找到了解决方案,但请不要修改代码并切换主题。相反,回答这个问题(是的,你可以回答你自己的问题),然后问一个关于新错误的新问题。请参见“编辑问题中的代码”下的和。(我删除了我之前的评论,因为它不清楚。)@wjandrea你是对的,我应该更仔细地阅读OP的评论,这绝对是一个不同的主题/问题。