1

我正在尝试将网站中的报废数据输出到 csv 文件中,首先我遇到了 UnicodeEncoding 错误,但在使用了这段代码之后:

if __name__ == "__main__":
reload(sys)
sys.setdefaultencoding("utf-8")

我能够生成 csv,下面是相同的代码:

import csv
import urllib2
import sys  
from bs4 import BeautifulSoup
if __name__ == "__main__":
    reload(sys)
    sys.setdefaultencoding("utf-8")
page =    urllib2.urlopen('http://www.att.com/shop/wireless/devices/smartphones.html').read()
soup = BeautifulSoup(page)
soup.prettify()
for anchor in soup.findAll('a', {"class": "clickStreamSingleItem"}):
        print anchor['title']        
        with open('Smartphones.csv', 'wb') as csvfile:
                spamwriter = csv.writer(csvfile, delimiter=',')        
                spamwriter.writerow([(anchor['title'])])     

但是我在输出 csv 中只得到一个设备名称,我没有任何编程背景,请原谅我的无知。你能帮我找出这个问题吗?

4

1 回答 1

1

这是可以预料的;每次找到元素时,您都从头开始编写文件。在遍历链接之前只打开一次文件,然后为找到的每个锚点写入行:

with open('Smartphones.csv', 'wb') as csvfile:
    spamwriter = csv.writer(csvfile, delimiter=',')        
    for anchor in soup.findAll('a', {"class": "clickStreamSingleItem"}):
        print anchor['title']        
        spamwriter.writerow([anchor['title'].encode('utf8')])   

打开用于写入w的文件首先会清除文件,并且您正在为每个锚点执行此操作。

至于您的 unicode 错误,请不惜一切代价避免更改默认编码。相反,正确编码您的行;我在上面的示例中这样做了,您可以删除整个.setdefaultencoding()调用(以及reload()之前的调用)。

于 2012-12-19T08:11:25.923 回答