我制作了一个脚本,使用BeautifulSoup从服务器下载几页。我正在将输出写入.csv文件。我使用的是python 2.7.2
我在某些时候遇到以下错误:
Traceback (most recent call last):
File "parser.py", line 114, in <module>
c.writerow([title,description,price,weight,category,subcategory])
UnicodeEncodeError: 'ascii' codec can't encode character u'\xb7' in position 61: ordinal not in range(128)
我正在下载的页面(我检查了确切的页面)似乎没有任何奇怪的字符。
我尝试了类似问题的一些解决方案。我尝试像这样解码:
content.decode('utf-8','ignore')
但它不起作用。
正如Python and BeautifulSoup encoding issues所指出的那样。我检查了网站源代码,它也没有任何指定的元数据。我也尝试使用'{3}}中建议的''chardet''但是urlread()方法似乎不起作用。我尝试使用urlopen()代替它崩溃了。
我该如何处理?
答案 0 :(得分:3)
BeautifulSoup为您提供 unicode ,因此要将其写入您需要编码数据的文件:
content.encode('utf8')
在将数据传递到csv
.writerow()
方法之前执行此操作。这里不需要添加'ignore'
,因为UTF-8可以编码所有Unicode。你的全文可能是:
c.writerow([e.encode('utf8') for e in (title, description, price, weight, category, subcategory)])
使用列表推导依次编码每个元素。
如果您需要先操纵字符串,请先将NavigableString
个对象转换为 unicode
对象:
unicode(description)
或者,不要对每个列值进行编码,而是使用csv
module examples section中包含的UnicodeWriter
类来自动编码数据。
HTML通常可以使用像em-dashes这样的字符或者不能用ASCII编码的不间断空格,并且你不会通过对页面进行快速可视化扫描来选择它们。
答案 1 :(得分:1)
似乎页面内容已成功解析为unicode对象,但CSV编写器隐式尝试转换回str并因此抛出上述错误。由于UTF-8适用于任何角色,因此您可以使用以下内容:
c.writerow([title.encode("UTF-8"),description.encode("UTF-8"),price.encode("UTF-8"),weight.encode("UTF-8"),category.encode("UTF-8"),subcategory.encode("UTF-8")])
如果这不起作用,那么您可以尝试通过找出该点数据的确切格式来进一步调试它。您可以通过将每个变量的字符串表示形式写入CSV文件而不是字符串本身来完成此操作,如下所示:
c.writerow([repr(title),repr(description),repr(price),repr(weight),repr(category),repr(subcategory)])
然后您可以查看CSV文件,您可能会看到如下行:
"abc","def",u"\u00A0123","456","abc","def"
然后,您可以将任何棘手的字符串(例如u“\ u00A0123”)粘贴到python窗口中,并直接使用它们,尝试不同的编码和解码方式。