无法将输出写入 csv bs4 python

Posted

技术标签:

【中文标题】无法将输出写入 csv bs4 python【英文标题】:Not able to write output to csv bs4 python 【发布时间】:2013-11-25 07:32:07 【问题描述】:

我正在尝试将以下代码的输出写入 csv 文件。数据被覆盖。所以最后我只能在输出文件中看到从网站上抓取的最后数据。

from bs4 import BeautifulSoup
import urllib2
import csv
import re
import requests
for i in xrange(3179,7000):
    try:
        page = urllib2.urlopen("http://bvet.bytix.com/plus/trainer/default.aspx?id=".format(i))
    except:
        continue
    else:
        soup = BeautifulSoup(page.read())
        for eachuniversity in soup.findAll('fieldset','id':'ctl00_step2'):
            data = i, re.sub(r'\s+',' ',''.join(eachuniversity.findAll(text=True)).encode('utf-8')),'\n'
    print data  
    myfile = open("ttt.csv", 'wb')
    wr = csv.writer(myfile, quoting=csv.QUOTE_ALL)
    wr.writerow(data)

我是新手。我不知道我错在哪里。

更新

from bs4 import BeautifulSoup
import urllib2
import csv
import re
import requests
with open("BBB.csv", 'wb') as myfile:
    writer = csv.writer(myfile, quoting=csv.QUOTE_ALL)
    for i in xrange(3179,7000):
        try:
            page = urllib2.urlopen("http://bvet.bytix.com/plus/trainer/default.aspx?id=".format(i))
        except Exception:
            continue
        else:
            soup = BeautifulSoup(page.read())
            for eachuniversity in soup.findAll('fieldset','id':'ctl00_step2'):
                data = [i] + [re.sub('\s+', '', text).encode('utf8') for text in eachuniversity.find_all(text=True) if text.strip()]
                writer.writerow(data)

【问题讨论】:

附带说明,如果你解决了这个问题,你很可能会得到一个空的或不完整的文件。当您open 一个文件处于写入模式而从未close 它时,由 Python 和您的操作系统决定是否刷新任何缓冲数据,他们可能会决定不这样做。 (为了让您的生活真正有趣,它们会在您测试时始终刷新,然后在您尝试真正使用脚本时停止刷新。) 【参考方案1】:

在循环之前打开文件一次,并在找到它时在循环中添加数据:

with open("ttt.csv", 'wb') as myfile:
    writer = csv.writer(myfile, quoting=csv.QUOTE_ALL)
    for i in xrange(3179,7000):
        try:
            page = urllib2.urlopen("http://bvet.bytix.com/plus/trainer/default.aspx?id=".format(i))
        except urllib2.HTTPError:
            continue
        else:
            soup = BeautifulSoup(page.read(), from_encoding=page.info().getparam('charset'))
            for eachuniversity in soup.findAll('fieldset','id':'ctl00_step2'):
                data = [i] + [re.sub('\s+', ' ', text).strip().encode('utf8') for text in eachuniversity.find_all(text=True) if text.strip()]
                writer.writerow(data)

每次以w 写入模式打开文件时,它都会被截断。任何以前的数据都将被删除,以便为您将要写入的新数据腾出位置。诀窍是在开始时只打开文件一次,并保持打开状态以在保持打开状态的同时写入所需的所有内容。

当外部for 循环完成时,此处的with 语句会为您关闭文件。

from_encoding 将服务器标头提供的任何字符集传递给BeautifulSoup,因此它不必费力猜测;对于给定的 URL,如果您不添加该关键字参数,BeautifulSoup 实际上会猜错。

我删除了您添加到每一行的换行符; csv.writer() 类会为您处理换行符。我还将毯子 except: 更改为 except urllib2.HTTPError: 以捕获只是实际上在这里抛出的异常,而不是所有

文本被清理以将每个文本条目写入单独的列。

这会产生如下输出:

"3179","Neue Suche starten","MoHaJa - die Schule für Hunde und Halter","Stähli Monika","Meisenweg 1","3303 Jegenstorf","Routenplaner","Ausbildung/Anerkennung: Triple-S Ausbildungszentrum für Mensch und Hund","Sprache: Deutsch","Tel.: +41 31 761 14 33","Handy: +41 79 760 41 69","info@hundeschule-mohaja.ch","www.hundeschule-mohaja.ch"
"3180","Neue Suche starten","Dogs Nature","Fernandez Salome-Nicole","Dorzematte 30","3313 Büren zum Hof","Routenplaner","Ausbildung/Anerkennung: Triple-S Ausbildungszentrum für Mensch und Hund","Sprache: Deutsch","Tel.: 079 658 71 71","info@dogsnature.ch","www.dogsnature.ch"
"3181","Neue Suche starten","Gynny-Dog","Speiser Franziska","Wirtsgartenweg 27","4123 Allschwil","Routenplaner","Ausbildung/Anerkennung: Triple-S Ausbildungszentrum für Mensch und Hund","Sprache: Deutsch","Handy: 076 517 20 94","franziska.speiser@gynny-dog.ch","www.gynny-dog.ch"
"3183","Neue Suche starten","keep-natural","Mory Sandra","Beim Werkhof","4434 Hölstein","Routenplaner","Ausbildung/Anerkennung: Triple-S Ausbildungszentrum für Mensch und Hund","Sprache: Deutsch","Tel.: 079 296 00 65","sandra.mory@keep-natural.ch","www.keep-natural.ch"
"3184","Neue Suche starten","Küng Silvia","Eptingerstrasse 41","4448 Läufelfingen","Routenplaner","Ausbildung/Anerkennung: Triple-S Ausbildungszentrum für Mensch und Hund","Sprache: Deutsch","Tel.: 061 981 38 04","Handy: 079 415 83 57","silvia.kueng@hotmail.com","www.different-dogs.ch"

【讨论】:

嗨.. 我在等你。谢谢马丁金。我想做一点美化。如何正确分隔值?我尝试在re.sub 行中做一些事情。它实际上变得一团糟。 我不确定你的意思;您希望在eachuniversity 中找到的文本成为输出文件中的一组列? 是的。确切地。现在,我的输出是 excel 中单个列中的一件事。 我仍然没有正确理解它。我猜是一些缩进问题。我的输出文件仍然是空的。我写的和你写的一样 @Venky:删除try:except: 行会发生什么?例如。运行urlopen() 调用而不捕获所有异常?【参考方案2】:

移动这一行:

myfile = open("ttt.csv", 'wb')

for 循环之前。每次循环都会覆盖文件。

【讨论】:

【参考方案3】:

它被覆盖了,因为你在循环中写了这个

 myfile = open("ttt.csv", 'wb')

把它移到外面。

【讨论】:

wr = csv.writer(…) 应该移到循环之外。 (如果保持原样,它实际上不会破坏任何东西,但它并不完全有利于可读性。)

以上是关于无法将输出写入 csv bs4 python的主要内容,如果未能解决你的问题,请参考以下文章

如何将 CSV 输出写入标准输出?

将 CSV 写入标准输出或文件名

将 60K csv 的输出合并并写入一个 csv

将命令的输出写入 csv 文件的特定列,unix

将for循环的输出写入python中的csv

如何将 for 循环输出写入 csv 文件?