2

我正在尝试做的事情:

我正在尝试在 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

问题: 它使用附加模式“a”,根据文档,“w”是它覆盖的写入模式。当我将其更改为“w”时,没有任何反应。

f=open("reviews.txt", "w") #does not work!

实际问题: 编辑:让我清除混乱。

我只想要一个包含所有评论的review.txt文件。每次我运行脚本时,我都希望脚本根据我的输入用新的评论覆盖现有的 review.txt。

谢谢,

4

2 回答 2

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):
于 2014-04-16T09:16:31.983 回答
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 的回答with open("reviews.txt", "w")中所述使用。

于 2014-04-16T09:16:14.837 回答