我要做的是:
我正在尝试使用' 打开'在python中,这是我试图执行的脚本。我想给"餐厅名称"作为输入和文件保存(reviews.txt)。
脚本: (简而言之,脚本会转到页面并抓取评论)
from bs4 import BeautifulSoup
from urllib import urlopen
queries = 0
while queries <201:
stringQ = str(queries)
page = urlopen('http://www.yelp.com/biz/madison-square-park-new-york?start=' + stringQ)
soup = BeautifulSoup(page)
reviews = soup.findAll('p', attrs={'itemprop':'description'})
authors = soup.findAll('span', attrs={'itemprop':'author'})
flag = True
indexOf = 1
for review in reviews:
dirtyEntry = str(review)
while dirtyEntry.index('<') != -1:
indexOf = dirtyEntry.index('<')
endOf = dirtyEntry.index('>')
if flag:
dirtyEntry = dirtyEntry[endOf+1:]
flag = False
else:
if(endOf+1 == len(dirtyEntry)):
cleanEntry = dirtyEntry[0:indexOf]
break
else:
dirtyEntry = dirtyEntry[0:indexOf]+dirtyEntry[endOf+1:]
f=open("reviews.txt", "a")
f.write(cleanEntry)
f.write("\n")
f.close
queries = queries + 40
问题: 它使用追加模式&#39; a&#39;并根据文件,&#39; w&#39;是覆盖它的写入模式。当我把它改成&#39; w&#39;没有任何反应。
f=open("reviews.txt", "w") #does not work!
实际问题: 编辑:让我清除混乱。
我只想要所有评论的 ONE review.txt 文件。每次运行脚本时,我都希望脚本根据我的输入用新的评论覆盖现有的review.txt。
谢谢,
答案 0 :(得分:3)
如果我理解你想要的行为,那么这应该是正确的代码:
with open("reviews.txt", "w") as f:
for review in reviews:
dirtyEntry = str(review)
while dirtyEntry.index('<') != -1:
indexOf = dirtyEntry.index('<')
endOf = dirtyEntry.index('>')
if flag:
dirtyEntry = dirtyEntry[endOf+1:]
flag = False
else:
if(endOf+1 == len(dirtyEntry)):
cleanEntry = dirtyEntry[0:indexOf]
break
else:
dirtyEntry = dirtyEntry[0:indexOf]+dirtyEntry[endOf+1:]
f.write(cleanEntry)
f.write("\n")
这将打开文件只写一次,并将所有条目写入其中。否则,如果它嵌套在for
循环中,则会为每个review
打开该文件,因此会被下一次审核覆盖。
with
语句确保当程序退出块时,文件将被关闭。它还使代码更易于阅读。
我还建议避免在if语句中使用括号,而不是
if(endOf+1 == len(dirtyEntry)):
最好只使用
if endOf + 1 == len(dirtyEntry):
答案 1 :(得分:1)
如果要将每条记录写入不同的新文件,则必须以不同方式命名,因为这样您始终会使用新数据覆盖旧数据,而只留下最新记录。
您可以像这样增加文件名:
# at the beginning, above the loop:
i=1
f=open("reviews_{0}.txt".format(i), "a")
f.write(cleanEntry)
f.write("\n")
f.close
i+=1
<强>更新强>
根据您最近的更新,我发现这不是您想要的。要实现您的目标,您只需将f=open("reviews.txt", "w")
和f.close()
移到for
循环之外。这样,您不会在循环内多次打开它,每次都会覆盖以前的条目:
f=open("reviews.txt", "w")
for review in reviews:
# ... other code here ... #
f.write(cleanEntry)
f.write("\n")
f.close()
但是,我建议您使用Alexey's answer中描述的with open("reviews.txt", "w")
。