编辑:我似乎已经以即席的方式修复了它。我确实认为这是一个切实可行的解决方案,但这是不可接受的答案。我只添加了写之前的fp.read()语句。谁能解释为什么这会避免Errno 0?那就是没有fp.read()行的情况。
我一直在尝试制作一个脚本,每天将一些html代码附加到我的便笺文件中。我在更新文件时遇到了麻烦。我已经尝试了所有open()
标签(r
,w
,a
,r+
等)。
代码:
从bs4导入BeautifulSoup bs = BeautifulSoup
import datetime
with open("crossfireNewNotes.html",'a+') as fp:
soup= bs(fp,"lxml")
print "8 " + str(soup)
print "9 " + str(soup.html)
today=str(datetime.date.today())
print "11 " + str(soup)
if soup.select("body#" + today) ==[]:
new_body=soup.new_tag("body",id=today)
new_p=soup.new_tag("p")
new_olink=soup.new_tag("a",link=today)
new_ilink=soup.new_tag("a",href=today)
soup.html.append(new_body)
soup.html.select("body#" + today)[0].append(new_olink)
soup.html.select("body#" + today)[0].select("a[link=" + today + "]").append(new_p)
soup.body.insert_before(new_ilink)
print "25 " + str(soup)
fp.read()
fp.write(str(soup))
fp.close()
之前,文件对象是NoneType,这给我带来了其他问题。现在它似乎可以正常打开,但是我在cmd中有以下输出:
Line 8: <html></html>
Line 11: <html></html>
Line 25: <html><a href="2018-08-18"></a><body id="2018-08-18"><a link="2018-08-18"></a></body></html>
Traceback (most recent call last):
File "noter.py", line 29, in (module)
fp.write(str(soup))
IOError: [Errno 0] Error
或者,如果有人有更好的方法,我会向他们开放。
答案 0 :(得分:1)
您遇到的问题在于以fp
模式打开文件处理程序append
和通过soup.html.append
和soup.html.select
方法移动指针。一旦要写入文件,指针将不再位于文件末尾。如果您read()
文件,则指针又位于末尾,因此您可以再次写入。更好的方法是fp.seek(0,2)
查找文件的结尾。
更好的是,您可以先将html文件的内容加载到BeautifulSoup中,进行更改,然后从汤对象写入文件,从而使用两个单独的文件IO。