0

我制作了一个脚本,使用 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 和 BeautifulSoup 编码问题中所指出的那样。我检查了网站来源,它也没有任何指定的元数据。我还尝试按照如何在 python 中下载具有正确字符集的任何(!)网页中的建议使用“chardet” ?但是 urlread() 方法似乎不起作用。我尝试使用 urlopen() ,但它崩溃了。

我该如何进行呢?

4

2 回答 2

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)

或者,不要对每个列值进行编码,而是使用模块示例部分UnicodeWriter中包含的类来自动编码您的数据。csv

HTML 通常可以使用无法编码为 ASCII 的字符,如破折号或不间断空格,并且您不会通过快速视觉扫描页面来挑选这些字符。

于 2013-04-27T09:48:19.440 回答
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 窗口中并直接使用它们,尝试不同的编码和解码方式。

于 2013-04-27T09:50:30.840 回答